程序员小刘最近很烦。公司新推出电子商务推广项目,以发放优惠券的形式达到产品推广的目的。然而,项目开展了一段时间后,活动并不顺利。产品经理分析了一下,认为推广力度不够,需要结合多种形式的活动来达到推广的目的。于是他陆续找到了小刘,加了今天的打折促销。活动,明天加满折扣促销。..小刘只好加班加点改密码,本就稀疏的头发少了几根。作为小刘的资深朋友,你看着他那一堆ifelse,微微皱眉,说,你不能这样,鬼知道这个产品经理有什么烂主意。这种情况建议大家使用攻略模式来梳理一下。后期扩展也很方便。小刘一听,两只熊猫眼凑到一起,问道,攻略模式,是什么?看着好友疑惑的眼神,你推了推眼镜,开启了教学模式。什么是策略模式?策略模式是指不同类之间有相同的行为,但行为的具体表现形式各不相同,具体要执行的行为可以在运行时动态选择。以小刘的业务场景为例,各种促销活动各不相同,但都有一个共同的行为——降低商品价格,但每项活动的计算方式不同。想象一下,如果不使用策略模式,当用户选择参加某个活动时,我们的代码中会出现一系列的判断。如果使用优惠券,则根据优惠券规则计算产品价格。然后根据折扣促销规则计算商品价格。如果您参加的是满折活动,则按照满折活动规则计算商品价格。..这无疑是灾难性的。让我们看看如何使用策略模式来实现这个场景。在策略模式中,存在三个基本角色:strategy:抽象的策略角色,定义了常见的行为(商品价格计算)。concreteStrategy:具体的策略类,需要实现策略,重写自己的行为方法。contextStrategy:策略上下文,持有策略角色供客户端调用。下面我们根据这三个角色在代码中实现一下。1.定义策略角色接口strategy我这里使用的接口形式,当然也可以使用抽象类。2.定义具体的策略类在这个场景中,我们为促销活动定义了三个策略类,分别是优惠券活动、折扣活动和满减活动。优惠券策略类折扣活动策略类全量折扣活动策略类3.定义上下文在上下文策略类中,会持有策略类,可以执行策略的行为方法。在策略类中,我们传入选择的折扣策略,然后执行,然后直接在折扣策略类中执行相应的计算。以上就是一个简单的策略模式实现过程。这样,对外隐藏了每一个策略的实现,而是通过上下文来执行具体的策略方法。如果需要扩展,不需要修改上下文,只需要添加新的策略类即可。通过上下文调用,便于代码维护。策略模式与工厂模式的由来了解工厂模式的同学可能会有一些疑惑(不懂的同学可以查看另一篇文章设计模式之工厂模式——需要的是工厂而不是作坊,这是类似于工厂模式太相似了,没错,策略模式和工厂模式在代码结构上非常相似,上面提到的业务场景也可以使用工厂模式来实现。但是使用工厂模式,我们首先取的时候获取目标对象,获取目标对象后执行相应的方法,而策略模式直接执行目标方法。这两种模式的侧重点不同,一种侧重于生成对象,另一种侧重于实现behavior.其实策略模式很多时候是和工厂模式结合使用的,在上面的测试方法中,我们直接使用了打折策略类new来执行策略方法,但是在实际应用中,客户端调用是不可能传递一个对象的,一般是类型代码,或者是一个数字,比如传递数字1表示优惠券,传递数字2表示表示折扣,传递数字3表示全额折扣。我们拿到编号后,就可以和工厂模型结合起来了。具体策略类的对象通过策略模式执行目标方法,这样整体结构会更加清晰。
