什么是策略模式
策略模式为所有的算法定义一个抽象接口,继承这个接口,对所有的算法加以封装和实现,而算法的选择由客户端决定,举个例子,排序算法有多种,那么定义一个含有sort的抽象算法接口,继承这个接口,实现其中的sort方法,客户端使用时,自己决定使用归并排序或是快速排序等
策略模式的角色
Strategy(抽象策略类):只负责定义策略方法。
ConcreteStrategy(具体策略类):负责实现策略方法
Context(环境类):客户端通过这个类设置策略,调用策略
策略模式的优点
我的理解是策略模式方便进行功能扩展,使一个类不会过于臃肿,例如排序算法,虽然我们可以把所有的排序算法封装到一个类中,但每次添加一个排序算法,就要修改这个类,久而久之,这个类会越来越臃肿,更改删除一个排序算法可能要寻找很久,而策略模式不存在这种问题,只需要实现接口就可以添加一个排序算法,更改和删除排序算法只需要找到对应的实现类即可。
实例
大家都知道玩游戏只有充钱才能变强,那么我们就拿这个作为例子,超级VIP购买英雄级武器五折,VIP购买八折,普通玩家原价购买
strategy:
package strategy;
/**
*
* @author lzy
*/
public interface strategy {
double getPrice(double price);
}
VIP策略:
package strategy;
/**
*
* @author lzy
*/
public class VIP implements strategy{
@Override
public double getPrice(double price){
return 0.8*price;
}
}
超级VIP策略:
package strategy;
/**
*
* @author lzy
*/
public class superVIP implements strategy{
@Override
public double getPrice(double price){
return 0.5*price;
}
}
普通玩家策略:
package strategy;
/**
*
* @author lzy
*/
public class general implements strategy{
@Override
public double getPrice(double price){
return price;
}
}
context:
package strategy;
/**
*
* @author lzy
*/
public class context {
private strategy stra;
public void setStrategy(strategy stra){
this.stra=stra;
}
public double algorithm(double price){
return stra.getPrice(price);
}
}
main:
package strategy;
/**
*
* @author lzy
*/
public class main {
public static void main(String[] args){
double price=88800;
context cont=new context();
System.out.println("VIP购买价格:");
cont.setStrategy(new VIP());
System.out.println(cont.algorithm(price));
System.out.println("超级VIP购买价格:");
cont.setStrategy(new superVIP());
System.out.println(cont.algorithm(price));
System.out.println("普通玩家购买价格:");
cont.setStrategy(new general());
System.out.println(cont.algorithm(price));
}
}
运行结果:
策略模式没有像备忘录模式一样给我惊艳的感觉,只是一种模块化的编程思想,使用策略模式可以让代码结构更加清晰,可以避免类过于臃肿