目录
策略模式设计的每一个算法都封装了起来,使他们可以相互替换,通过一个对象委派不同的算法给相应的客户进行使用.
例如一家百货公司,规定在逢年过节的时候进行促销活动. 针对不同的节日(春节、中秋节、端午节)推出不同的促销活动,然后由 促销员 将促销活动展示给客户.
策略模式主要角色如下:
针对以上案例进行实现.
- /**
- * 抽象策略: 促销活动接口
- */
- public interface Strategy {
-
- void show();
-
- }
- /**
- * 具体策略类: 春节活动类
- */
- public class StrategyA implements Strategy {
-
- @Override
- public void show() {
- System.out.println("春节到了,全场买一送一!");
- }
-
- }
- /**
- * 具体策略类: 中秋节活动类
- */
- public class StrategyB implements Strategy {
-
- @Override
- public void show() {
- System.out.println("中秋节到了,全场满 50 送月饼!");
- }
-
- }
- /**
- * 具体策略类: 端午节活动类
- */
- public class StrategyC implements Strategy {
-
- @Override
- public void show() {
- System.out.println("端午节到了,全场满 80 送粽子!");
- }
-
- }
- /**
- * 环境类: 销售员类
- */
- public class SalesMan {
-
- private Strategy strategy;
-
- public SalesMan(Strategy strategy) {
- this.strategy = strategy;
- }
-
- public Strategy getStrategy() {
- return strategy;
- }
-
- public void setStrategy(Strategy strategy) {
- this.strategy = strategy;
- }
-
- public void showAction() {
- strategy.show();
- }
-
- }
- public class Client {
-
- public static void main(String[] args) {
- //1.春节
- SalesMan man = new SalesMan(new StrategyA());
- man.showAction();
- System.out.println("======================");
- //2.中秋节
- man.setStrategy(new StrategyB());
- man.showAction();
- System.out.println("======================");
- //3.端午节
- man.setStrategy(new StrategyC());
- man.showAction();
- System.out.println("======================");
- }
-
- }
执行结果如下:

优点:
缺点:
客户端必须知道所有的策略类,并自行决定使用哪个策略类.
策略模式将造成产生多个策略类(一个策略产生一个类).
