“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第2篇文章,点击查看活动详情”
1、简介
策略模式就是把各个平等的具体实现进行抽象、封装成为独立的算法类,然后通过上下文和具体的算法类来进行交互。各个策略算法都是平等的,地位是一样的,正是由于各个算法的平等性,所以它们才是可以相互替换的。虽然我们可以动态的切换各个策略,但是同一时刻只能使用一个策略。
2、范例
比如去服装店买衣服,普通会员不打折,黄金会员打9折,铂金会员打8折,钻石会员打7折,这样不同的客户价格计算方式不同,这个时候就可以使用策略模式。
3、代码实现
3.1、定义接口
public interface IStrategy {
public void operate();
}
3.2、 根据会员等级,设置对应折扣
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折");
}
}
3.3、定义上下文,构造函数,使用哪个方法
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();
}
}
3.4、测试,达到预期效果
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");
}
}
4、优点
我们之前在选择方式的时候,往往会使用if-else语句,也就是用户不选择A那么就选择B这样的一种情况。这种情况耦合性太高了,而且代码臃肿,有了策略模式我们就可以避免这种现象,策略模式遵循开闭原则,实现代码的解耦合。扩展新的方法时也比较方便,只需要继承策略接口就好了。