学习java软件开发已有二年了,逐渐的从面向过程到面向对象编程,使我对开发有了一定的深入了解,也促使我对面向对象编程的深入学习,首先从设计模式开始。
以前也看过一些设计模式的书籍,但没有什么理解,也不懂其里面的思想,所以从现在开始,深入学习模式。
策略模式
策略模式属于对象的行为模式,其用意是针对一组算法,把每个算法封装到具有共同接口的独立类中,从而使它们能够互换。策略模式使得算法可以在不影响客户端的情况下发生变化。
所有这些算法完成的都是相同的工作,只有实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类和使用算法类之间的耦合。
策略模式的结构
策略模式涉及到三个角色:
1)环境(context)角色:持有一个strategy类的引用
2)抽象策略角色(strategy) 角色:此角色给出所有的具体策略类所需的接口,通常由一个接口或抽象类实现
3)具体策略类角色(ConcreteStrategy):包装了相关的算法和行为
/** * 抽象策略角色 */ public interface Strategy { void operate(); }
/** * 具体策略角色 */ public class ConcreteStrategy implements Strategy { public void operate() { System.out.println("具体策略角色"); } }
/** * 环境角色 */ public class Context { Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void operate() { this.strategy.operate(); } }
何时使用策略模式
1)如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。
2)如果系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些算法 类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则。客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。
3)一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。
4)如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现,此时,使用策略模式,把这些行为都转移到相应的策略类里面,就可以避免使用难以维护的条件选择语句,并体现出面向对象设计的概念。
策略模式的优缺点
优点:
1) 策略模式提供了管理相关的算法族的办法
2) 策略模式提供了可以替换继承关系的办法
3) 策略模式可以避免使用多重条件选择语句
缺点:
1)客户端必须知道所有的策略类,并自行决定使用哪种策略类
2)策略模式造成很多的策略类