策略模式(Strategy)
一、策略模式介绍
策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。
例如:
商场中的收银软件,内部是怎么针对不同的商品打不同的折扣呢?又或者,是怎么根据不同会员等级打不同的折扣呢?
其实内部就是定义了一个算法家族,给每个会员或者商品都指定一个特定的算法,根据不同的算法,打不同的折扣。
策略模式UML图:
Strategy(抽象算法接口):定义了所有支持算法的公共接口
ConcreteStrategyA、ConcreteStrategyB和ConcreteStrategyC:继承于Strategy,封装了具体的算法
Context(上下文):用来维护不同对象的不同算法实现
二、策略模式代码实现
这里以不同的用户买商品打折为例
首先定义一个抽象算法接口:
1
2
3
4
5
|
//抽象算法接口:定义了所有支持算法的公共接口 public interface Strategy { //算法方法:打印商品的价格(不同的实现打不同的折扣) public double getPrice( double price); } |
然后定义具体的各个算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
//具体的算法:普通用户,不打折 public class GeneralUser implements Strategy { @Override public double getPrice( double price) { System.out.println( "普通用户,不打折" ); return price; } } //具体的算法:注册用户:打9折 public class RegisterUser implements Strategy{ @Override public double getPrice( double price) { System.out.println( "注册用户:打9折" ); return price* 0.9 ; } } //具体的算法:普通会员:打8折 public class RegisterVip implements Strategy{ @Override public double getPrice( double price) { System.out.println( "普通会员:打8折" ); return price* 0.8 ; } } //具体的算法:老会员:打5折 public class OldVip implements Strategy{ @Override public double getPrice( double price) { System.out.println( "老会员:打5折" ); return price* 0.5 ; } } |
接下来开始定义一个上下文,用来维护不同用户不同的折扣。
1
2
3
4
5
6
7
8
9
10
11
12
|
//上下文:用来维护不同对象的不同折扣 public class Context { private Strategy strategy; //持有算法族的引用 public Context(Strategy strategy) { super (); this .strategy = strategy; } //打印价钱 public void printPrice( double price){ System.out.println( "应付金额:" +Math.round(strategy.getPrice(price))); } } |
客户端测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public static void main(String[] args) { double price = 998 ; //商品价格 Strategy generalUser = new GeneralUser(); //普通用户 Strategy registerUser = new RegisterUser(); //注册用户 Strategy registerVip = new RegisterVip(); //普通会员 Strategy oldVip = new OldVip(); //老会员 //根据不同的用户打不同的折扣 Context c1 = new Context(generalUser); c1.printPrice(price); Context c2 = new Context(registerUser); c2.printPrice(price); Context c3 = new Context(registerVip); c3.printPrice(price); Context c4 = new Context(oldVip); c4.printPrice(price); } |
打印结果如下:
普通用户,不打折
应付金额:998
注册用户:打9折
应付金额:898
普通会员:打8折
应付金额:798
老会员:打5折
应付金额:499
三、应用场景
策略模式本质:分离算法,选择不同的实现。
应用场景:
JAVASE的布局管理
Spring框架中,Resource接口,资源访问策略
javax.servlet.http.HttpServlet#service();
参考资料:
大话设计模式(带目录完整版).pdf
HEAD_FIRST设计模式(中文版).pdf
尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!