策略模式
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。
这个模式涉及到三个角色:
●环境(Context)角色:持有一个Strategy的引用。
●抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
●具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
例子:
如普通顾客跟vip顾客买东西结账,都是结账,但是走的策略不一样,通过顾客是否是vip走不同的策略,过程相同 ,但结果不同
策略模式的优缺点
优点:
符合开闭原则
避免使用多重if、else语句和switch
提高算法的保密性和安全性
缺点
客户端必须知道所有的策略,自己决定使用哪一种策略
代码中会出现很多的策略类,增加系统维护难度
代码示例:
抽象策略类:
public interface Strategy {
void doing();
}
具体实现策略类(付费打折否):
public class AStrategy implements Strategy {
@Override
public void doing() {
System.out.println("执行A策略");
}
}
public class BStrategy implements Strategy {
@Override
public void doing() {
System.out.println("执行B策略");
}
}
环境(Context)角色(结账):
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
//执行不同的策略
public void getStrategy() {
this.strategy.doing();
}
}
测试:
public class TextStrategy {
public static void main(String[] args) {
Context con = new Context(new AStrategy());
con.getStrategy();
}
}