策略模式就是把各个平等的具体实现进行抽象、封装成为独立的算法类,然后通过上下文和具体的算法类来进行交互。各个策略算法都是平等的,地位是一样的,正是由于各个算法的平等性,所以它们才是可以相互替换的。虽然我们可以动态的切换各个策略,但是同一时刻只能使用一个策略。
比如去服装店买衣服,普通会员不打折,黄金会员打9折,铂金会员打8折,钻石会员打7折,这样不同的客户价格计算方式不同,这个时候就可以使用策略模式。
public interface IStrategy {
public void operate();
}
复制代码
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("打9折");
}
}
复制代码
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("打8折");
}
}
复制代码
public class BlackEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("打7折");
}
}
复制代码
public class Context {
private IStrategy strategy;
//构造函数,要你使用哪个方法
public Context(IStrategy strategy){
this.strategy = strategy;
}
public void setStrategy(IStrategy strategy){
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
复制代码
public class Zhaoyun {
public static void main(String[] args) {
Context context;
System.out.println("----------黄金会员---------------");
context = new Context(new BackDoor());
context.operate();
System.out.println("\n");
System.out.println("----------铂金会员---------------");
context.setStrategy(new GivenGreenLight());
context.operate();
System.out.println("\n");
System.out.println("----------钻石会员---------------");
context.setStrategy(new BlackEnemy());
context.operate();
System.out.println("\n");
}
}
复制代码

我们之前在选择方式的时候,往往会使用if-else语句,也就是用户不选择A那么就选择B这样的一种情况。这种情况耦合性太高了,而且代码臃肿,有了策略模式我们就可以避免这种现象,策略模式遵循开闭原则,实现代码的解耦合。扩展新的方法时也比较方便,只需要继承策略接口就好了。
原文作者:后端Q;如有侵权,请联系管理员删除。