6.行为型 - 策略模式 (Stragety)

1.定义

  • 定义一些列的算法,每一个都封装起来,并且可以互相替换
  • 外层使用者无需感知算法的变化

2.UML类图

在这里插入图片描述

  • 角色说明:
    IStrategy : 策略的抽象接口
    BusStrategy / CarStrategy : 具体策略类
    CalculatorContext : 用来操作策略的上下文环境

3.UML实例代码

/**
 * Copyright (C), 2016-2020
 * FileName: IStrategy
 * Author: wei.zheng
 * Date: 2019/12/5 20:24
 * Description: 策略类抽象接口, 计算不同交通工具需要的费用
 */
public interface IStrategy {
    int calculatePrice(int distance);
}

/**
 * Copyright (C), 2016-2020
 * FileName: BusStrategy
 * Author: wei.zheng
 * Date: 2019/12/5 20:25
 * Description: 公共汽车策略
 */
public class BusStrategy implements IStrategy {

    /* 1块钱起步, 每5公里加1块 */
    @Override
    public int calculatePrice(int distance) {
        if (distance <= 0) {
            return 0;
        }

        return 1 + distance / 5;
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: CarStrategy
 * Author: wei.zheng
 * Date: 2019/12/5 20:26
 * Description: 小汽车策略类
 */
public class CarStrategy implements IStrategy {

    /* 10块钱起步,每公里加1块 */
    @Override
    public int calculatePrice(int distance) {
        return 10 + 1 * distance;
    }
}

/**
 * Copyright (C), 2016-2020
 * FileName: CalculatorContext
 * Author: wei.zheng
 * Date: 2019/12/5 20:28
 * Description: 策略Context类
 */
public class CalculatorContext {
    private IStrategy mStrategy;

    public void setStrategy(IStrategy strategy) {
        this.mStrategy = strategy;
    }

    public int calculatePrice(int distance) {
        return mStrategy.calculatePrice(distance);
    }
}
    /**
     * 策略模式使用示例
     */
    private void testStrategyPattern() {
        mCalculatorContext = new CalculatorContext();

        mCalculatorContext.setStrategy(new BusStrategy());
        int busPrice = mCalculatorContext.calculatePrice(20);

        mCalculatorContext.setStrategy(new CarStrategy());
        int carPrice = mCalculatorContext.calculatePrice(20);

        Log.d(TAG, "busPrice:" + busPrice + ", carPrice:" + carPrice);
    }

4.总结

策略模式是使用最频繁的设计模式之一,遵循开闭原则,扩展方便。
如何满足开闭原则? 即:定义抽象、注入不同实现!
适用与if-else或者switch - case 分支较多的场景。

发布了37 篇原创文章 · 获赞 0 · 访问量 579

猜你喜欢

转载自blog.csdn.net/qq_37514242/article/details/103413517
今日推荐