设计模式:策略模式(Strategy)
2016-08-20 08:32
579 查看
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
策略模式的角色:
1. 抽象策略角色(Strategy):策略类,通常由一个接口或者抽象类实现
2. 具体策略角色(ConcreteStrategy):包装了相关的算法和行为
3. 环境角色(Context):持有一个策略类的引用,最终给客户端调用
这里引用参考资料3中的例子来详细说明一下策略模式。
“赔了夫人又折兵”——这个是《三国演义》里的著名桥段,主要是说刘备要去吴国娶孙权妹妹了,走之前诸葛亮给了赵云三个锦囊:“你保主公入吴,可一次按这三个锦囊内之计行事。”第一计:初入东吴,告知全城刘备娶孙尚香,并拜访乔国老,让吴国太施压不让刺杀刘备;第二计:刘备沉迷酒色,乐而忘返之计,骗说:“今早接孔明来报,曹操起精兵五十万,杀奔荆州而来!军情十分紧急,请主公马上回荆州!”;第三计:逃跑之时,孙夫人断后。
1 抽象策略角色
2
3
4
2 具体策略角色
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
3 环境角色Context
2
3
4
5
6
7
8
9
10
11
12
13
14
4 测试代码
2
3
4
5
6
7
输出结果:
2
3
策略模式和工厂模式的区别
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;而策略模式是行为型的,它接受已经创建好的实例,实现不同的行为。
Jdk中的策略模式:
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
参考资料
1. 《23种设计模式》
2. 《细数JDK里的设计模式》
3. 《java设计模式之——策略模式》
策略模式的角色:
1. 抽象策略角色(Strategy):策略类,通常由一个接口或者抽象类实现
2. 具体策略角色(ConcreteStrategy):包装了相关的算法和行为
3. 环境角色(Context):持有一个策略类的引用,最终给客户端调用
这里引用参考资料3中的例子来详细说明一下策略模式。
“赔了夫人又折兵”——这个是《三国演义》里的著名桥段,主要是说刘备要去吴国娶孙权妹妹了,走之前诸葛亮给了赵云三个锦囊:“你保主公入吴,可一次按这三个锦囊内之计行事。”第一计:初入东吴,告知全城刘备娶孙尚香,并拜访乔国老,让吴国太施压不让刺杀刘备;第二计:刘备沉迷酒色,乐而忘返之计,骗说:“今早接孔明来报,曹操起精兵五十万,杀奔荆州而来!军情十分紧急,请主公马上回荆州!”;第三计:逃跑之时,孙夫人断后。
1 抽象策略角色
public interface Strategy { public void operate(); }1
2
3
4
2 具体策略角色
class ConcreteStrategyA implements Strategy { @Override public void operate() { System.out.println("初入东吴....#####"); } } class ConcreteStrategyB implements Strategy { @Override public void operate() { System.out.println("乐而不返....#####"); } } class ConcreteStrategyC implements Strategy { @Override public void operate() { System.out.println("腹背受敌....#####"); } }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
3 环境角色Context
public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void doOperate() { this.strategy.operate(); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
4 测试代码
Context context = null; context = new Context(new ConcreteStrategyA()); context.doOperate(); context = new Context(new ConcreteStrategyB()); context.doOperate(); context = new Context(new ConcreteStrategyC()); context.doOperate();1
2
3
4
5
6
7
输出结果:
初入东吴....##### 乐而不返....##### 腹背受敌....#####1
2
3
策略模式和工厂模式的区别
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;而策略模式是行为型的,它接受已经创建好的实例,实现不同的行为。
Jdk中的策略模式:
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
参考资料
1. 《23种设计模式》
2. 《细数JDK里的设计模式》
3. 《java设计模式之——策略模式》
相关文章推荐
- 设计模式随笔系列:鸭子-策略模式(Strategy)[原]
- 设计模式(18)-策略模式(Strategy)
- 设计模式之Strategy(策略)
- 设计模式解析(第二版)笔记4 Strategy 策略模式
- 设计模式(三)[策略(Strategy)模式]
- 设计模式之Strategy(策略)
- 学习设计模式之旅 / 策略模式 (Strategy) 推荐
- 设计模式学习1——策略模式(Strategy)
- Java设计模式-----Strategy策略模式
- 设计模式之策略模式(Strategy)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式与泡mm的关系之strategy策略模式及再思考
- 设计模式随笔系列:鸭子-策略模式(Strategy)
- 设计模式之Strategy(策略)
- 设计模式之策略模式(strategy)--游戏角色使用武器
- Head First 设计模式 C++实现-Strategy(策略模式)
- Head First 设计模式 C++实现-Strategy(策略模式)
- 设计模式(20)-策略模式(Strategy)