策略模式
策略模式(Strategy Pattern)也叫政策模式,是一种比较简单的模式。
主要解决:在有多种算法相似的情况下,使用if…else所带来的复杂和难以维护。
关键代码:实现同一个接口。
定义
定义一组算法,将每个算法封装起来,并且使它们之间可以互换。
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以互相替换,使得算法可以不影响到客户端的情况下改变。
策略模式涉及以下三个角色:
- 环境(Context)角色:该角色也叫上下文角色,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问,它持有一个Strategy类的引用。
- 抽象策略(Strategy)角色:该角色对策略、算法进行抽象,通常定义每个策略或算法必须具有的方法和属性。
- 具体策略(Concrete Strategy)角色:该角色实现抽象策略中具体操作,含有具体的算法。
Context.java
//环境角色
public class Context{
private Strategy strategy=null;
//构造函数
public Context(Strategy strategy){
this.strategy=strategy;
}
//调用策略方法
public void contextInterface(){
this.strategy.strategyInterface();
}
}
应用
- 优点
1)算法可以自由切换
2)避免使用多重条件判断
3)扩展性良好 - 缺点
1)策略类会增多
2)所有策略类都需要对外暴露 - 应用场景(典型)
1)多个类只是在算法或行为上稍有不同的场景
2)算法需要自由切换的场景
3)需要屏蔽算法规则的场景
实例:图书销售中不同的折扣算法
本实例中有三种折扣算法。
算法1:对有些图书没有折扣,即折扣算法中折扣值为0.
算法2:对有些图书的折扣是固定值为1元。
算法3:对有些图书的折扣是15%。
首先对这三种算法使用DiscountStrategy类进行抽象,然后使用3个具体算法类继承这个类,如图。
DiscountStrategy.java
//抽象折扣算法类
public abstract class DiscountStrategy{
private double price=0;
private int number=0;
public DiscountStrategy(double price,int number){
this.price=price;
this.number=number;
}
public double getPrice{
return price;
}
public int getNumber{
return number;