Java设计模式之策略模式

    技术2025-06-18  7

    Java设计模式之策略模式

    策略模式简介*

    策略模式角色: Strategy(策略)Strategy角色负责决定实现策略所必需的接口(API)。在示例程序中,由strategy接口扮演此角色。 ConcreteStrategy(具体的策略)ConcreteStrategy角色负责实现Strategy角色的接口(API),即负责实现具体的策略(战 略、方向、方法和算法)。 Context(上下文)负责使用Strategy角色。Context角色保存了ConcreteStrategy角色的实例,并使用ConcreteStrategy角色去实现需求(总之,还是要调用Strategy角色的接口(API))。策略模式的使用场景较多 一个项目中有许多类,它们之间的区别仅在于它们的行为,希望动态地让一个对象在许多行为中选择一种行为时; 一个项目需要动态地在几种算法中选择一种时; 一个对象有很多的行为,不想使用多重的条件选择语句来选择使用哪个行为时。使用策略模式好处: 策略模式不仅仅可以优化if else代码,其主要的作用还是解耦策略的定义、创建和使用,控制代码的复杂度,让每个部分都不至于过于复杂、代码量过多。除此之外,对于复杂代码来说, 策略模式还能让其满足开闭原则,添加新策略的时候,最小化、集中化代码改动,减少引入 bug 的风险。

    例子:我们旅游选择出行方式,传统if-else

    public class Temp { public static void main(String[] args) { travelPlan("B"); } public static void travelPlan(String travel){ if("A".equals(travel)){ System.out.println("坐飞机"); }else if("B".equals(travel)){ System.out.println("坐火车"); }else if("C".equals(travel)){ System.out.println("坐汽车"); } } }

    使用策略模式

    // 定义策略角色 public interface TravelStrategy { void doTravel(String travel); } ```java //定义具体的实现策略1 public class AirplaneTravel implements TravelStrategy { public void doTravel(String travel) { System.out.println("坐飞机"); } } //定义具体的实现策略2 public class CarTravel implements TravelStrategy{ public void doTravel(String travel) { System.out.println("坐汽车"); } } //定义具体的实现策略3 public class TrainTravel implements TravelStrategy { public void doTravel(String travel) { System.out.println("坐火车"); } } // 定义上下文,负责使用策略角色 public class TravelContext { private TravelStrategy travelStrategy; private String travel; public TravelContext(TravelStrategy travelStrategy, String travel) { this.travelStrategy = travelStrategy; this.travel = travel; } public TravelStrategy getTravelStrategy(){ return travelStrategy; } public boolean option(String travel){ return this.travel.equals(travel); } } /** * 使用策略模式将策略的定义,创建,使用解耦,让每一步变得简单,也可以使用这种模式替代传统的if-else语句,当我们有新的需求是时,只要定义好 具体的实现策略,然后加在静态代码块中就可以,其他不用修改,这样代码看起来比家简洁整齐,用java的话可以使用反射避免对类的修改,满足开闭原则。*/ import java.util.ArrayList; import java.util.List; public class Share { private static List<TravelContext> list=new ArrayList<TravelContext>(); // 加载策略 static { list.add(new TravelContext(new AirplaneTravel(),"A")); list.add(new TravelContext(new TrainTravel(),"B")); list.add(new TravelContext(new CarTravel(),"C")); } public static void main(String[] args) { doTravel("C"); } public static void doTravel(String travel) { for (TravelContext travelContext : list) { if(travelContext.option(travel)){ TravelStrategy travelStrategy = travelContext.getTravelStrategy(); travelStrategy.doTravel(travel); break; } } } }
    Processed: 0.012, SQL: 9