关于行为类的设计模式之策略模式的总结
来源:互联网 发布:网址域名能换吗 编辑:程序博客网 时间:2024/06/06 01:14
这个模式涉及到三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
publicclass Context { //持有一个具体策略的对象private Strategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */publicvoid contextInterface(){ strategy.strategyInterface(); } }
抽象策略类
publicinterface Strategy { /** * 策略方法 */publicvoid strategyInterface();}
具体策略类
publicclass ConcreteStrategyA implements Strategy { @Override publicvoid strategyInterface() { //相关的业务 }}
publicclass ConcreteStrategyB implements Strategy { @Override publicvoid strategyInterface() { //相关的业务 }}
publicclass ConcreteStrategyC implements Strategy { @Override publicvoid strategyInterface() { //相关的业务 }}
认识策略模式
策略模式的重心
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。
运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。
公有的行为
经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。
这其实也是典型的将代码向继承等级结构的上方集中的标准做法。
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
- 关于行为类的设计模式之策略模式的总结
- 行为型的设计模式-策略模式
- 设计模式 行为模式之策略模式
- 设计模式-行为型之策略模式
- 【设计模式】行为模式之Strategy策略
- Java 设计模式之策略模式的详解(行为模式)
- 关于策略模式的总结
- 设计模式-行为-策略
- java设计模式 -------- 行为模式 之 策略模式(1)
- java设计模式 -------- 行为模式 之 策略模式(2)
- java设计模式 -------- 行为模式 之 策略模式(3)
- java设计模式 -------- 行为模式 之 策略模式(4)
- java设计模式之行为型模式-策略模式
- 设计模式之行为型模式---策略模式
- Java设计模式之行为型模式(策略模式)
- 设计模式总结之行为型模式
- 设计模式之策略模式的学习
- 行为模式之策略模式
- Linux系统如何标识进程?
- PCL 构造一个绕任意轴旋转的变换矩阵
- 【python】系列简记--00:写在前面
- 萌新SQL基础学习1---续2
- 个人记录-LeetCode 92. Reverse Linked List II
- 关于行为类的设计模式之策略模式的总结
- 【hdoj_2570】迷障
- springmvc中拦截器,HandlerInterceptor接口的三个方法分别在什么时候拦截
- Lesson2 软件测试之测试理论概述(1)
- Sift特征
- GRUB2配置文件"grub.cfg"详解(GRUB2实战手册)
- Activity启动模式详解及其易用场景
- 面向对象编程之成员函数
- JAVA学习笔记0005