什么是策略模式
策略模式属于对象的行为模式,其实就是将一组算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换.策略模式使得算法可以在不影响客户端的情况下发生改变
策略模式的结构
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.
策略模式由三方参与: 1. 策略接口--定义所有支持的算法的公共接口 2. 具体策略--实现某具体的算法 3. 策略的应用环境---持有一个策略对象的引用.
使用场景
- 策略接口
//车票策略接口
public interface ITicketStrategy{
//策略方法
public double calcPrice(double ticketPrice);
}
- 具体策略实现类
//商务票策略
public class BusinessTicketStrategy implements ITicketStrategy {
@Override
public double calcPrice(double ticketPrice) {
System.out.println("商务座票价:"+ticketPrice);
return ticketPrice;
}
}
//一等坐票策略
public class TopRateTicketStrategy implements ITicketStrategy {
@Override
public double calcPrice(double ticketPrice) {
System.out.println("一等坐票价:"+ticketPrice*0.9);
return ticketPrice*0.9;
}
}
//二等坐票策略
public class SecondRateTicketStrategy implements ITicketStrategy {
@Override
public double calcPrice(double ticketPrice) {
System.out.println("二等座票价:"+ticketPrice*0.8);
return ticketPrice*0 .8;
}
}
- 策略应用环境
// 价格类--不同的策略产生不同的价格
public class Price {
//策略对象
private ITicketStrategy ticketStrategy;
//传入一个具体的策略对象
public Price(ITicketStrategy ticketStrategy){
this.ticketStrategy = ticketStrategy;
}
//计算车票价格
public double execute(double ticketPrice){
return this.ticketStrategy.calcPrice(ticketPrice);
}
}
- 客户端
public class Client {
public static void main(String[] args) {
//创建策略对象
ITicketStrategy ticketStrategy = new BusinessTicketStrategy();
//创建应用环境
Price price = new Price(ticketStrategy);
//计算价格
double quote = price.execute(400);
System.out.println(quote);
}
}
认识策略模式
- 策略模式仅仅封装算法,提供算法的变更 ,不决定何时使用何种算法,在什么情况下使用什么算法由客户端决定
- 各个策略算法之间是平等的,他们之间可以相互替换
- 使用策略模式可以动态地让一个对象在许多行为中选择一种行为
策略模式的优点
- 策略模式提供了管理相关的算法族的办法,可以将公共的代码移到父类里,从而避免重复的代码
- 使用策略模式可以避免使用多重条件转移语句.多重转移语句不易维护,他把采取哪一种算法的逻辑与算法的逻辑混合在一起.
策略模式的缺点
- 客户端必须知道所有的策略类,并自行决定使用那一个策略,策略模式只适用于客户端知道所有的算法的情况.
- 策略模式会造成很多的策略类.