设计模式之第8章-策略模式(Java实现)
“年前大酬宾了啊,现在理发冲500送300,冲1000送500了。鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊。不过话说那个理发店的老板好傻啊,冲1000才送500,不如冲两次500,这样可以送600呢。”“这只能说明你不是很笨,但是也算不上聪明。”“啊?难道我想错了?”“这是一种策略,策略,懂?他如果是冲1000送700的话你是不是很大的可能性冲500?而不是1000,但是如果这样的话,在“聪明人”,对,没错,就是你这样的人来说,冲两次500表示对于老板的智商上的鄙视,那么,你就会冲1000了吧,这么说来,你懂了么?”“好吧,亏我还是策略模式,这点小把式就把我给蒙骗了,丢人丢大发了。”(编者按:小子,你还是图样图森破啊。)
策略模式之自我介绍
洒家呐,是一种比较简单的模式,定义如下:
Define a family of algorithms, encapsulate each one, and make them interchangeable。翻译过来就是说:定义一组算法,或将每个算法都封装起来,并且使他们之间可以互换。下面给出具体类图:
由于图中的介绍已经很详细了,所以就不再赘述,我使用的就是面向对象的继承和多态机制,理解起来那可是相当的容易~
策略模式之自我分析
若说到好处和劣势么,恩,先说劣势吧:
- 客户如果想选择一个合适的策略,那么就务必了解所有的策略以及各个策略之间有什么不同,这个时候就不得不暴漏策略具体的实现。不过嘛,魔高一尺道高一丈(好像哪里有点不对、、、不管了,继续),这个缺点可以配合着先前讲的工厂方法模式来弥补了。
- Strategy与Context之间的通信开销,由于策略算法不一定全部用得到,所以会带来一定的浪费。
- 增加了对象的数目。
优势:
- 算法可以自由切换。
- 避免使用多重判断语句,消除一些条件语句。
- 扩展性良好。
- 可以根据不同的时间/空间的要求选择不同的策略。
策略模式之实现
话说是骡子是马拉出来遛遛,既然如此,那洒家就把代码亮出来,请各位戴好墨镜。以下代码就根据理发店充值活动来实现的。首先是抽象的策略接口:
1 public interface Strategy{ 2 //每个充值的方法都是一个算法 3 public void reCharge(); 4 }
然后是冲500送300的策略:
1 public class St1 implements Strategy{ 2 public viod reCharge(){ 3 System.out.println("冲500送300"); 4 } 5 }
接着是冲1000送500的策略的具体实现:
1 public class St2 implements Strategy{ 2 public viod reCharge(){ 3 System.out.println("冲1000送500"); 4 } 5 }
接下来这个还需要一个封装类用于放这些个策略,方便使用,也就是类图中的Context封装类,代码如下:

1 public class Context{ 2 //构造函数,你要入手哪一个优惠政策 3 private Strategy strategy; 4 public Context (Strategy strategy) 5 { 6 this.strategy = strategy; 7 } 8 9 //入手优惠政策 10 public void reCharge(){ 11 this.strategy.reCharge(); 12 } 13 }
通过构造函数把优惠政策传进去,然后用reCharge方法来执行相关的策略方法。什么,还不懂?好吧好吧,服了你啦,看洒家写一个测试类:

1 public class Y{ 2 3 public static void main(String[] args) { 4 Context context; 5 //入手第一个优惠 6 context = new Context(new St1()); 7 context.reCharge(); 8 9 //入手第二个优惠 10 context = new Context(new St2()); 11 context.reCharge(); 12 } 13 }
好了,具体实现到此结束。下面介绍一下应用的场景。
策略模式之运用场景
当存在以下情况时,可以考虑使用策略模式:
- 许多相关的类仅仅是行为有异。
- 需要使用一个算法的不同变体。
- 一个类定义了多种行为。
- 需要屏蔽算法规则。
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?