目录
什么是策略模式
应用场景
业务场景实现
抽象类
实现类
Context上下文
测试类
策略模式的优缺点
什么是策略模式
他将定义的算法家族、分别封装起来,让他们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。
策略模式使用的就是面向对象的继承和多态机制,从而实现同一行为在不同场景下具备不同实现。
应用场景
策略模式在生活中应用很多。比如一个人的胶水比例与他的工资有关,不同的工资水平对应不同的税率;再比如我们在下单前需要选择支付方式,或者是商店折扣、比如支付宝、微信等。
策略模式可以解决在多种算法相似的情况下,避免使用if.else或switch…case带来的复杂性和臃肿性。在日常业务开发中,策略模式适用于以下场景:
首先看下策略模式的通用UML类图:
从类图中,我们可以看到,策略模式主要包含三种角色:
上下文角色(Context)
用来操作策略的上下文环境,屏蔽高层模块(客户端)对策略,算法的直接访问,封装可能存在的变化。
抽象策略角色(Strategy)
规定策略或算法的行为
具体策略角色(Concrete Strategy)
具体的策略或算法实现
业务场景实现
抽象类
/**
* 策略类,定义所有支持的算法公共接口
*/
/**
* 抽象算法类
*/
public abstract class strategy {
//算法方法
public abstract void algorithmInterface();
}
实现类
public class ConcreteStrategyA extends strategy{
@Override
public void algorithmInterface() {
System.out.println("算法A实现");
}
}
public class ConcreteStrategyB extends strategy{
@Override
public void algorithmInterface() {
System.out.println("算法B实现" );
}
}
public class ConcreteStrategyC extends strategy{
@Override
public void algorithmInterface() {
System.out.println("算法C实现");
}
}
Context上下文
/**
* 上下文,维护对象的引用
*/
public class content {
strategy strategy;
public content(策略模式.strategy strategy) {
this.strategy = strategy;
}
public void contentInterface(){
//根据具体的策略对象,调用琦算法的方法
strategy.algorithmInterface();
}
}
测试类
public class main {
public static void main(String[] args) {
content content1;
content1 = new content(new ConcreteStrategyA());
content1.contentInterface();
content1 = new content(new ConcreteStrategyB());
content1.contentInterface();
content1 = new content(new ConcreteStrategyC());
content1.contentInterface();
}
}
策略模式的优缺点
优点
- 策略模式符合开闭原则
- 避免使用多重条件转移语句,如if…else和switch这种。
- 使用策略模式可以提高算法的保密性和安全性
缺点
- 客户端需要知道所有的策略,并且自行决定使用哪一个策略类
- 代码中会产生非常多的策略类,造成代码的臃肿,怎加维护难度。