一、定义
策略模式:定义了算法族(将一组行为想象成一族算法),分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
二、策略模式的结构
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的额对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。也就是说,准备一组算法并将每一个算法封装起来,使得它们可以互相互换。看下面的结构框图:
我们由框图得到三个角色:
(1)环境角色(context):持有一个Strategy的引用;
(2)抽象策略模式(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
(3)具体策略角色(ConcreteStrategy):包装了相关的算法或行为。
三、代码实例
package Model;
/**
* Created by L_kanglin on 2017/3/6.
*/
public class Context {
//注意这是个接口
private Strategy strategy;
/*
*构造一个函数,传入一个具体策略对象
* @param strategy
*/
public Context(Strategy strategy) {
this.strategy = strategy;
}
/*
* 策略方法
* */
public void congtextInterface(){
strategy.strategyInterfece();
}
}
public interface Strategy {
//策略方法,抽象方法,等着后面去实现
public void strategyInterfece();
}
public class ConcreteStrategyA implements Strategy {
@Override
public void strategyInterfece() {
//进行相关的业务
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void strategyInterfece() {
//进行相关的业务
}
}
public class ConcreteStrategyC implements Strategy {
@Override
public void strategyInterfece() {
//进行相关的业务
}
}
/**
* Created by L_kanglin on 2017/3/6.
*/
public class Client {
public static void main(String[] args){
//选择并创建需要使用到的策略对象,一种多态的展示
Strategy strategy = new ConcreteStrategyA();
Context context = new Context(strategy);
//执行业务
context.congtextInterface();
//然后执行各自的子方法
}
}
从上面的实例中,策略模式仅仅是封装算法,提供新的算法插入到已有的系统中,以及以前的算法从系统中淘汰的方法,策略模式并不决定何时使用某种算法,在什么情况下使用算法是由客户端决定的。
四、分析
(1)策略模式保证了各个策略算法的平等性,对于一系列的具体实现,大家的地位是平等的,实现各个具体算法实现之间的相互切换,而它们彼此之间是没有依赖的可以理解为是相同行为的不同实现;
(2)运行期间,策略模式在同一个时刻只能使用一个具体的策略实现;
(3)所有的具体策略类都有一些公有的行为。此时就应该把这些公有的行为放到共同的抽象策略角色Strategy中。
文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…