内容简介:策略模式属于用处很多并且很简单的一种设计模式在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。策略模式中定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式属于用处很多并且很简单的一种设计模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的 设计模式 属于行为型模式。
策略模式中定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
场景描述
我们再来假设一个场景,根据不同的下订单入口对用户进行积分奖励
app下单用户 | web下单用户 | 小程序下单用户 |
---|---|---|
奖励100积分 | 奖励20积分 | 奖励50积分 |
坏代码
package design.pattern.reward; public class Reward { /** * 下单平台 0 web 1 小程序 2 app */ private int platform = 0; public Reward(int platform) { this.platform = platform; } /** * 给用户送积分 */ public void giveScore() { int score = 0; switch (platform) { case 0: //web //todo score = 20; break; case 1: //小程序 //todo score = 50; break; case 2: //app //todo score = 100; break; } System.out.println("送给用户" + score + "分"); } } 复制代码
业务调用:
package design.pattern.reward; public class PayNotify { public static void main(String[] args) { Reward reward = new Reward(2); reward.giveScore(); } } 复制代码
当我们的算法越来越多,越来越复杂的时候,并且当某个算法发生变化,将对所有其他计算方式都会产生影响,不能有效的弹性、清晰的拓展,所以这个时候我们的策略模式就上场了。
策略模式UML图(画图 工具 不工作了)
策略模式实现
1.首先接口声明-抽象策略
package design.pattern.reward.score; public interface InterfaceScore { /** * 送积分 */ public void giveScore(); } 复制代码
2.我们实现接口的giveScore方法-实现具体策略算法
app端积分
package design.pattern.reward.score; public class AppScore implements InterfaceScore { private int score = 100; /** * 送积分 */ public void giveScore() { //todo 具体算法逻辑 System.out.println("送你积分" + score); } } 复制代码
web端积分:
package design.pattern.reward.score; public class WebScore implements InterfaceScore { private int score = 20; /** * 送积分 */ public void giveScore() { //todo 具体算法逻辑 System.out.println("送你积分" + score); } } 复制代码
- 不同策略算法调度类
package design.pattern.reward; import design.pattern.reward.score.InterfaceScore; public class Context { private InterfaceScore scoreObj; public Context(InterfaceScore algorithmObj) { this.scoreObj = algorithmObj; } public void giveScore() { this.scoreObj.giveScore(); } } 复制代码
- 客户端调用
Context context1 = new Context(new AppScore()); context1.giveScore(); Context context2 = new Context(new WebScore()); context2.giveScore(); 复制代码
output:
送你积分100 送你积分20 复制代码
好像跟我们刚开始的调用方法不一样,约定好的是传一个type值来确定计算的方法,现在直接将计算规则方法暴露给了调用方
继续改造 策略模式+简单工厂
package design.pattern.reward; import design.pattern.reward.score.AppScore; import design.pattern.reward.score.InterfaceScore; import design.pattern.reward.score.WebScore; public class Context { private InterfaceScore scoreObj; public Context(int platform) { switch (platform) { case 0: //web this.scoreObj = new WebScore(); break; case 1: //小程序 //todo break; case 2: //app this.scoreObj = new AppScore(); break; } } public void giveScore() { this.scoreObj.giveScore(); } } 复制代码
调用:
Context context1 = new Context(0); context1.giveScore(); Context context2 = new Context(2); context2.giveScore(); 复制代码
是不是很简单。。。
总结:
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法.减少了算法与使用算法之间的耦合.
策略模式是用来封装算法的,但在实践中我们可以用它来封装几乎任何类型的规则, 只要在分析过程中需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
和上次讲到的模版方法模式差异
模版方法模式使用了继承方式实现算法,而策略模式使用了组合方式 模版方法模式对于算法拥有绝对的控制,而策略模式不对算法控制 模版方法的依赖程度要比策略模式高 。。。。。
更多精彩内容关注呆呆公众号:
以上所述就是小编给大家介绍的《设计模式第二讲--策略模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Code Reading
Diomidis Spinellis / Addison-Wesley Professional / 2003-06-06 / USD 64.99
This book is a unique and essential reference that focuses upon the reading and comprehension of existing software code. While code reading is an important task faced by the vast majority of students,......一起来看看 《Code Reading》 这本书的介绍吧!