Strategy 属于行为模式,用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,它可以客户端的选择来,决定用什么实现。
Context(上下文环境) 其内组合了一个策略的抽象类,然后具体的实现交给继承策略抽象类的子类去实现。
从上面一句话,可以看到,Strategy 涉及到三个角色:
Context环境角色 :它是使用策略模式的场景,即持有一个策略类。
抽象策略角色: 这是一个抽象角色,通过是由一个接口事抽象类实现,这个类提供所有的具体策略所需的接口。
具体策略(ConcreteStrategy)角色 :实现抽象策略类提供的接口,不同的实现,有不同的具体策略类。
模板可以是这样的:
上下文角色:
抽象策略角色:
具体策略类:
从这个模板中可以知道:在同一个环境中,抽象策略中只是定义了行为,相同的行为而不同的实现方式交由具体的策略类去实现。
何时使用策略模式:
a.一个系统里面有许多类,但是他们的区别只是他们的行为,那么可以使用Strategy动态让一个对象选择行为的一种。
b.一个系统动态的在几个算法中选择一种。
c.一个系统的算法使用的数据不可以让客户端知道。
d.如果一个对象有很多的行为,不用恰当的模式,这些行为就只好使用多重条件选择语句来实现,如果这时使用策略模式可以避免使用难以维护的多重选择语句。
Strategy的优点与缺点:
a.恰当使用继承,把公用代码移动到父类中,从而避免重复的代码。
b.策略模式提供了可以替换继承者关系的办法。
c.避免了多重条件的使用
fault:
a.客户端必须知道理解所有的策略,算法,并自行决定使用哪一个策略类。
b.会产生很多具体算法的策略实现类,可以使用享元模式来减少对象的数量。
Context(上下文环境) 其内组合了一个策略的抽象类,然后具体的实现交给继承策略抽象类的子类去实现。
从上面一句话,可以看到,Strategy 涉及到三个角色:
Context环境角色 :它是使用策略模式的场景,即持有一个策略类。
抽象策略角色: 这是一个抽象角色,通过是由一个接口事抽象类实现,这个类提供所有的具体策略所需的接口。
具体策略(ConcreteStrategy)角色 :实现抽象策略类提供的接口,不同的实现,有不同的具体策略类。
模板可以是这样的:
上下文角色:
public class Context { private Strategy strategy; /** * 策略方法,算法 */ public void algorithm() { strategy.strategyAlgorithm(); } }
抽象策略角色:
public abstract class Strategy { /** * 抽象策略方法,算法 */ public abstract void strategyAlgorithm(); }
具体策略类:
public class ConcreteStrategy extends Strategy { /** * 策略实现 */ public void strategyAlgorithm() { //different subStrategy have different algorithm } }
从这个模板中可以知道:在同一个环境中,抽象策略中只是定义了行为,相同的行为而不同的实现方式交由具体的策略类去实现。
何时使用策略模式:
a.一个系统里面有许多类,但是他们的区别只是他们的行为,那么可以使用Strategy动态让一个对象选择行为的一种。
b.一个系统动态的在几个算法中选择一种。
c.一个系统的算法使用的数据不可以让客户端知道。
d.如果一个对象有很多的行为,不用恰当的模式,这些行为就只好使用多重条件选择语句来实现,如果这时使用策略模式可以避免使用难以维护的多重选择语句。
Strategy的优点与缺点:
a.恰当使用继承,把公用代码移动到父类中,从而避免重复的代码。
b.策略模式提供了可以替换继承者关系的办法。
c.避免了多重条件的使用
fault:
a.客户端必须知道理解所有的策略,算法,并自行决定使用哪一个策略类。
b.会产生很多具体算法的策略实现类,可以使用享元模式来减少对象的数量。