动物园里有什么呢有狮子老虎大象还有饲养员还有游客还有还有就是设计模式。为什么还有设计模式呢我们就先从入园开始来一场娱乐与学习的盛宴吧。入园要先买票买票可以售票处买也可以小程序买也可以App买那就出现了这样的场景同一个动作「买票」有多种独立的算法 / 实现售票处窗口买票、小程序买票、App买票可以动态切换各个方案之间不存在自动流转。这种就是策略模式。策略模式定义定义一系列算法把每一个算法封装起来并且让它们可以互相替换。算法独立于使用它的客户端而变化。结构图角色策略接口定义算法方法具体策略实现策略接口并重写算法方法Context持有策略的引用在方法中调用的策略引用的方法。示例用策略模式写出动物园买票的案例。// 策略接口 public interface Strategy { void buyTicket(); } // 售票口 public class TicketWindowStrategy implements Strategy { Override public void buyTicket() { System.out.println(到动物园售票口买票); } } // 小程序 public class MiniProgramStrategy implements Strategy { Override public void buyTicket() { System.out.println(使用动物园小程序买票); } } // APP public class AppStrategy implements Strategy { Override public void buyTicket() { System.out.println(使用动物园App买票); } } // Context public class Context { private Strategy strategy; public Context(Strategy strategy) { if(strategy null){ throw new IllegalArgumentException(策略不能为null); } this.strategy strategy; } public void setStrategy(Strategy strategy) { if(strategy null){ throw new IllegalArgumentException(策略不能为空); } this.strategy strategy; } public void executeBuyTicket() { strategy.buyTicket(); } } // 测试 public class TicketMain { public static void main(String[] args) { Context context new Context(new TicketWindowStrategy()); context.executeBuyTicket(); // 通过set方法改变策略 context.setStrategy(new MiniProgramStrategy()); context.executeBuyTicket(); } }现在我们要加一个「自助机」买票只需要再新增一个「自助机策略类」就可以了。当我们以后遇到同一个行为动作会有不同的实现方式并且算法之间不会自动流转切换这句话很重要。就可以考虑策略模式了。所以策略模式是一种行为型设计模式。但是设计模式有一个缺点其中一个客户端必须知道所有策略类才能挑选合适的策略。用白话一点的语言解释就是客户端需要new 对应的策略类。那种该怎么解决呢我们需要结合另外一种设计模式——静态工厂模式。静态工厂模式这种设计模式非常简单用一句话概括由一个工厂类根据传入的参数动态决定创建哪一个产品类的实例。注意静态工厂不算是GoF23种设计模式之一。就是用的场景比较多了。角色分析抽象产品静态工厂返回的抽象类型。具体产品抽象产品的具体实现类。工厂类一个静态方法方法中带有参数根据参数new 不同的具体产品返回抽象产品类型。上面的买票策略我们可以使用静态工厂创建不同的策略类。// 抽象产品 public interface Shape { void draw(); } // 具体产品1圆形 public class Circle implements Shape{ Override public void draw() { System.out.println(绘制圆形); } } // 具体产品2矩形 public class Rectangle implements Shape{ Override public void draw() { System.out.println(绘制矩形); } } // 工厂类静态方法根据参数创建实例【静态工厂核心】 public class ShapeFactory { // 静态创建方法 public static Shape getShape(String type){ if(circle.equals(type)){ return new Circle(); }else if(rectangle.equals(type)){ return new Rectangle(); } return null; } } public class Client { public static void main(String[] args) { Shape s1 ShapeFactory.getShape(circle); s1.draw(); Shape s2 ShapeFactory.getShape(rectangle); s2.draw(); } }我们将买票策略和静态工厂模式结合起来部分代码改变如下// 新增一个工厂类 public class StrategyFactory { public static Strategy getStrategy(String code){ if(code.equals(tickWindow)){ return new TicketWindowStrategy(); } if(code.equals(minProgramStrategy)){ return new MiniProgramStrategy(); } if(code.equals(appStrategy)){ return new AppStrategy(); } throw new IllegalArgumentException(参数无效); } } // 客户端改动 public static void main(String[] args) { Strategy ticketWindowStrategy StrategyFactory.getStrategy(ticketWindow); Context context new Context(ticketWindowStrategy); context.executeBuyTicket(); // 动态切换策略 context.setStrategy(StrategyFactory.getStrategy(miniProgramStrategy)); context.executeBuyTicket(); }