专业的JAVA编程教程与资源

网站首页 > java教程 正文

阿瑟Java (34):策略模式(亚瑟教学)

temp10 2024-09-30 00:30:17 java教程 208 ℃ 0 评论

PS:创作不易,感谢阅读,希望对读者有所帮助,喜欢的话可以点赞、收藏、关注,作者会持续更新 Java 生态圈常见知识。黑色加粗为重点关注内容!

  • 基本描述
    • 一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式
    • 定义一系列的算法,并把它们一个个封装起来,使它们可相互替换。
  • 主要解决
    • 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
  • 如何解决
    • 将这些算法封装成一个一个的类,任意地替换。
  • 关键代码
    • 实现同一个接口。
  • 优点:
    • 算法可以自由切换
    • 避免使用多重判断条件
    • 扩展性良好
  • 缺点
    • 策略类会增多,并且所有策略类都会对外暴露。
  • 使用场景
    • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
    • 一个系统需要动态地在几种算法中选择一种。
    • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
  • 实现
    • 创建一个 Strategy 接口和 Strategy 接口的实体类
    • 创建一个 Context 类表示执行某种策略
    • 通过传入不同的【实体类】,让 Context 选择执行实体类对应的方法

代码示例

  • 创建一个接口:Strategy.java
public interface Strategy {
   public int doOperation(int num1, int num2);
}
  • 创建实现接口的实体类
    • OperationAdd.java
public class OperationAdd implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}
    • OperationSubtract.java
public class OperationSubtract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}
    • OperationMultiply.java
public class OperationMultiply implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 * num2;
   }
}
  • 创建 Context 类
public class Context {
   private Strategy strategy;
 
   public Context(Strategy strategy){
      this.strategy = strategy;
   }
 
   public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
   }
}
  • 使用 Context 来查看当它改变策略 Strategy 时的行为变化。
public class StrategyPatternDemo {
   public static void main(String[] args) {
      Context context = new Context(new OperationAdd());    
      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationSubtract());      
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationMultiply());    
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}

阿瑟Java (34):策略模式(亚瑟教学)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表