模式导读:
在生活中,我们时常会遇到好多类似的场景,在购物的时候,我们作为消费者可以选择各种购买东西的方式,比如我可以购买零食,购买生活用品,购买饮料,也就是根据适用场景选择对应的实施方式。然而当我们作为一名店长面对消费者时,我们可以根据各种不同的客户定制相应的优惠策略,也就是销售的策略也可以根据不同的客户而有不同的实施方式。
参考类图:
实现代码:
1.首先要有一个抽象的策略类接口,里面对应不同的应用场景可以定义不同的抽象方法
1 package com.etc; 2 //抽象策略类 3 public interface Strategy { 4 //购物时的场景 5 void shopping(); 6 7 }
2.然后定义具体的策略子类实现对应场景下的策略方法
(1).BuyDrinks.java
1 package com.etc; 2 //具体策略实现子类 3 public class BuyDrinks implements Strategy { 4 //定义具体的策略实现方法 5 @Override 6 public void shopping() { 7 8 System.out.println("选择购买饮料"); 9 } 10 11 }
(2)BuySnacks.java
1 package com.etc; 2 //具体策略实现子类 3 public class BuySnacks implements Strategy { 4 //定义具体的策略实现方法 5 @Override 6 public void shopping() { 7 8 System.out.println("选择购买零食"); 9 10 } 11 12 }
3.定义一个类实现一个能够根据不同用户需要然后选择返回对应的不同具体策略实现的方法,就是你用户需要什么,我就给你一个分析师判断你的需求,然后选择对应的策略实施方式
1 public class Holder { 2 // 以集合对象存储针对不同的情况下不同执行策略 3 Map<String, Strategy> map = new HashMap<>(); 4 5 // 初始化所有可能情况以及选择相关策略 6 private void init() { 7 map.put("饿", new BuySnacks()); 8 map.put("渴", new BuyDrinks()); 9 } 10 11 // 针对不同情景选用不同策略 12 public Strategy select(String msg) { 13 init(); 14 Strategy s = map.get(msg); 15 return s; 16 } 17 }
4.定义一个测试类打印不同的策略实施方式
1 //客户端 2 public class Client { 3 4 public static void main(String[] args) { 5 6 String hungry = "饿"; 7 String dry = "渴"; 8 Holder holder = new Holder(); 9 // 根据不同的情景选择对应策略 10 holder.select(hungry).shopping(); 11 holder.select(dry).shopping(); 12 13 } 14 }
运行效果截图:
策略模式的优缺点:
优点:可以动态的改变对象的行为
缺点:1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2、策略模式将造成产生很多策略类
适用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。