ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【行为型】策略模式

2021-12-22 20:34:35  阅读:125  来源: 互联网

标签:策略 行为 模式 Strategy 状态机 new type public


一、策略模式

定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

策略定义:

public interface Strategy {
  void algorithmInterface();
}

public class ConcreteStrategyA implements Strategy {
  @Override
  public void  algorithmInterface() {
    //具体的算法...
  }
}

public class ConcreteStrategyB implements Strategy {
  @Override
  public void  algorithmInterface() {
    //具体的算法...
  }
}

策略创建:为了封装创建逻辑,我们需要对客户端代码屏蔽创建细节。我们可以把根据type创建策略的逻辑抽离出来,放到工厂类中。

针对无状态的策略:使用Map

 1 public class StrategyFactory {
 2   private static final Map<String, Strategy> strategies = new HashMap<>();
 3 
 4   static {
 5     strategies.put("A", new ConcreteStrategyA());
 6     strategies.put("B", new ConcreteStrategyB());
 7   }
 8 
 9   public static Strategy getStrategy(String type) {
10     if (type == null || type.isEmpty()) {
11       throw new IllegalArgumentException("type should not be empty.");
12     }
13     return strategies.get(type);
14   }
15 }
View Code

针对有状态的策略:

 1 public class StrategyFactory {
 2   public static Strategy getStrategy(String type) {
 3     if (type == null || type.isEmpty()) {
 4       throw new IllegalArgumentException("type should not be empty.");
 5     }
 6 
 7     if (type.equals("A")) {
 8       return new ConcreteStrategyA();
 9     } else if (type.equals("B")) {
10       return new ConcreteStrategyB();
11     }
12 
13     return null;
14   }
15 }
View Code

策略模式使用:

1、配置文件指定策略名,然后通过工厂在动态时决定  

2、直接代码指定具体策略


 

二、职责链模式

典型实现:Servlet的filter chain(addFilter、doFilter)、Spring Interceptor


 

三、状态模式(不常用,适用状态机)

状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。不过,状态机的实现方式有多种,除了状态模式,比较常用的还有分支逻辑法和查表法。

 

标签:策略,行为,模式,Strategy,状态机,new,type,public
来源: https://www.cnblogs.com/clarino/p/15720956.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有