1、简介
策略模式就是把各个平等的具体实现进行抽象、封装成为独立的算法类,然后通过上下文和具体的算法类来进行交互。各个策略算法都是平等的,地位是一样的,正是由于各个算法的平等性,所以它们才是可以相互替换的。虽然我们可以动态的切换各个策略,但是同一时刻只能使用一个策略。
2、范例
比如去服装店买衣服,普通会员不打折,黄金会员打9折,铂金会员打8折,钻石会员打7折,这样不同的客户价格计算方式不同,这个时候就可以使用策略模式。
3、代码实现
3.1、定义接口
public interface IStrategy {public void operate();
}
复制代码
3.2、 根据会员等级,设置对应折扣
public class BackDoor implements IStrategy {@Overridepublic void operate() {System.out.println("打9折");}
}
复制代码
public class GivenGreenLight implements IStrategy {@Overridepublic void operate() {System.out.println("打8折");}
}
复制代码
public class BlackEnemy implements IStrategy {@Overridepublic 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这样的一种情况。这种情况耦合性太高了,而且代码臃肿,有了策略模式我们就可以避免这种现象,策略模式遵循开闭原则,实现代码的解耦合。扩展新的方法时也比较方便,只需要继承策略接口就好了。