- 策略模式:
定义一系列的算法,并且将每个算法封装起来。让他们可以相互替换。策略模式是对于算法的包装,把算法本身与算法的使用分隔开,使用不同的对象管理。 - 策略模式示意图:
来源于《菜鸟教程》
策略模式设计到的角色有:
- 策略角色:即图上的Strategy。对于开发人员来说,即为抽象类或者接口,主要目的是提供给到具体策略实现类做继承或者实现。
- 具体策略:即为图上的OperationAdd,OperationSubstract,OperationMultiply.主要目的是实现不同的算法或者说是行为。
- 环境角色:即图上的Context;上下文环境,持有 Stragegy 的引用。
3.实例:
场景:某航空公司,需要根据用户的会员等级分别给予不同的票价折扣。
价格计算接口:
public interface Price {
double calPrice(double price);
}
价格计算实现算法:
- 非会员不打折
public class NoMember implements Price{
@Override
public double calPrice(double price) {
return price;
}
}
- 初级会员打九折
public class PrimaryMember implements Price {
@Override
public double calPrice(double price) {
return price*0.9;
}
}
- 中级会员打八折
public class MiddleMember implements Price {
@Override
public double calPrice(double price) {
return price*0.8;
}
}
- 高级会员打五折
public class HighMember implements Price {
@Override
public double calPrice(double price) {
return price*0.5;
}
}
价格类(Context 类):
public class Member {
private Price price;
public Member(Price price) {
this.price = price;
}
public double caculate(float oldPrice){
return price.calPrice(oldPrice);
}
}
测试函数:
public class Main {
public static void main(String[] args) {
//高级会员
Member member = new Member(new HighMember());
System.out.println("高级会员:"+member.caculate(100));
//非会员
member=new Member(new NoMember());
System.out.println("非会员:"+member.caculate(100));
}
}
通过以上实例,可以总结策略模式的优缺点如下:
- 优点:
- 结构清晰,把策略分离成一个个单独的类「替换了传统的 if else」
- 代码耦合度降低。提高了代码的扩展性。
- 缺点:
- 随着系统的复杂度增加,会有非常多的策略类,并且客户端需要知道每个策略类的具体内容。不然无法知道该使用哪个策略类。
总结:
通过策略模式的学习,我们可以知道,策略模式可以降低系统的耦合度,提高系统的可扩展性。策略模式是类似设置一个调度中心,通过这个调度中心去调度不同的算法来实现我们的功能,这样可以省略在代码中写很多的if…else的语句。
项目实例代码Git地址:
https://gitee.com/CoderJu/DesignPattern.git