• 策略模式


    简介:

      指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法

      对象具有某种行为,但是在不同的场景中,该行为会有不同的算法实现。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

    组成:

    • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
    • 具体策略角色:包装了相关的算法和行为。
    • 环境角色:持有一个策略类的引用,最终给客户端调用。

    应用场景:

    • 1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
    • 2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
    • 3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

    代码举例:

      旅游出行,交通工具有飞机(Airplane)、火车(Train)、骑自行车(Bicycle)。

    1 /**
    2  *  策略模式
    3  *  定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。
    4  *  本模式使得算法可独立于使用它的客户变化
    5  */
    6 public interface TravelStrategy {
    7 
    8     void travel();
    9 }
    1 /**
    2  * 具体策略一:乘坐飞机
    3  */
    4 public class AirPlaneStrategy implements TravelStrategy {
    5 
    6     public void travel() {
    7         System.out.println("坐飞机去旅游。。。");
    8     }
    9 }
    1 /**
    2  * 具体策略二:坐火车
    3  */
    4 public class TrainStrategy implements TravelStrategy {
    5     public void travel() {
    6         System.out.println("坐火车去旅游。。。");
    7     }
    8 }
    1 /**
    2  * 具体策略三:骑自行车
    3  */
    4 public class BicycleStrategy implements TravelStrategy {
    5     public void travel() {
    6         System.out.println("骑自行车去旅游。。。。");
    7     }
    8 }
     1 /**
     2  * 环境类(Context):
     3  * 用一个ConcreteStrategy对象来配置。
     4  * 维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
     5  * 算法解决类,以提供客户选择使用何种解决方案:
     6  */
     7 public class PersonContext {
     8 
     9     private TravelStrategy travelStrategy;
    10 
    11     public PersonContext(TravelStrategy travelStrategy) {
    12         this.travelStrategy = travelStrategy;
    13     }
    14 
    15     public void travel(){
    16         travelStrategy.travel();
    17     }
    18 
    19 }

    测试

     1 public class MainApp {
     2 
     3     public static void main(String[] args) {
     4         TravelStrategy strategy1 = new AirPlaneStrategy();
     5         PersonContext person1 = new PersonContext(strategy1);
     6         person1.travel();   //坐飞机去旅游。。。
     7 
     8 
     9         TravelStrategy strategy2 = new TrainStrategy();
    10         PersonContext person2 = new PersonContext(strategy2);
    11         person2.travel();   //坐火车去旅游。。。
    12     }
    13 }

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    工作流二次开发之新增表单实践(二)
    layui表格及工作流二次开发实践(一)
    记一个递归封装树形结构
    SpringCloud微服务之宏观了解
    统一结果返回&统一异常处理
    mybatis-Plus 实践篇之CRUD操作
    修改MariaDB-root密码
    iftop-监控服务器实时带宽情况
    Wordpress安装-报错说明
    MariaDB忘记root密码
  • 原文地址:https://www.cnblogs.com/zchok/p/11392945.html
Copyright © 2020-2023  润新知