22.策略者模式
- Strategy(抽象策略):抽象策略类,并且定义策略执行入口
- ConcreteStrategy(具体策略):实现抽象策略,实现algorithm方法
- Context(环境):运行特定的策略类。
策略模式需要一个策略接口,不同的策略实现不同的实现类,在具体业务环境中仅持有该策略接口,根据不同的场景使用不同的实现类即可。
面向接口编程,而不是面向实现。
策略模式的优点:
1、干掉繁琐的 if、switch 判断逻辑;
2、代码优雅、可复用、可读性好;
3、符合开闭原则,扩展性好、便于维护;
策略模式的缺点:
1、策略如果很多的话,会造成策略类膨胀;
2、使用者必须清楚所有的策略类及其用途;
实例
汽车的不同挡位(concreteStrategy)由驾驶人(context)来决定
接口类和其实现类
/** * @author wuyimin * @create 2021-07-29 18:53 * @description 策略的接口类 */ public interface GearStrategy { void algorithm(String string); } public class ConcreteStrategyA implements GearStrategy { @Override public void algorithm(String string) { System.out.println("实用策略A:当前的挡位"+string); } } public class ConcreteStrategyB implements GearStrategy { @Override public void algorithm(String string) { System.out.println("实用策略B:当前的挡位"+string); } }
上下文类
/** * @author wuyimin * @create 2021-07-29 18:55 * @description 上下文类,控制者 */ public class Context { public final static Hashtable<String,GearStrategy> hashtable=new Hashtable<>(); //静态代码块初始化,定义策略方法 static { //如果还有其他的策略只管往里面加就行了 hashtable.put("A",new ConcreteStrategyA()); hashtable.put("B",new ConcreteStrategyB()); } //获取策略的方法 public GearStrategy getStrategy(String s){ if(s.equals("A")||s.equals("B")) return hashtable.get(s); else throw new IllegalArgumentException("类型还就那个不存在"); } public static void main(String[] args) { Context context = new Context(); GearStrategy a = context.getStrategy("A"); a.algorithm("挡位拉满"); GearStrategy b = context.getStrategy("B"); b.algorithm("挡位拉满"); GearStrategy c=context.getStrategy("C"); } }