设计模式——策略设计模式

什么是策略设计模式?

策略模式定义了一系列算法,并将每一个算法封装起来,而且是他们之间可以相互切换,让算法独立于使用它的客户而独立变化。

分析下定义,策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。

参考文章:
https://www.cnblogs.com/MrRightZhao/p/8000421.html
https://blog.csdn.net/u012124438/article/details/70039943/

策略设计模式UML

环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

策略模式的典型代码如下:

抽象策略类:

public interface Strategy {
    /**
     * 策略方法
     */
    public void strategyInterface();
}

具体策略类:

public class ConcreteStrategyA implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }

}

public class ConcreteStrategyB implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }

}

环境角色类:

public class Context {
    //持有一个具体策略的对象
    private Strategy strategy;
    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    /**
     * 策略方法
     */
    public void contextInterface(){

        strategy.strategyInterface();
    }

}

然后我们举一个开车的案例,实现效果就是,给小明传什么car,小明就会开什么车。

策略设计模式案例:开车

1.抽象策略类:CarStrategy(是一个接口,Strategy角色)

/**
 * 1.抽象策略类:CarStrategy接口
 */

public interface CarStrategy {
    /**
     * 策略方法
     */
    void run();
}

2.具体策略类:SmallCarConcreteStrategy和TruckCarConcreteStrategy(ConcreteStrategy角色)

/**
 * 2.具体策略实现子类-SmallCarConcreteStrategy
 */

public class SmallCarConcreteStrategy implements CarStrategy {
    @Override
    public void run() {
        //相关的业务
        System.out.println("今天开着小汽车去旅游");
    }
}


public class TruckCarConcreteStrategy implements CarStrategy {
    @Override
    public void run() {
        //相关的业务
        System.out.println("今天开着大卡车去拉货");
    }
}

3.应用场景类:PersonContext(Context角色)

/**
 * 3.应用场景类
 */

public class PersonContext {
    private String name;    //姓名
    private Integer age;    //年龄
    private CarStrategy car;  //拥有车

    public PersonContext(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public void setCar(CarStrategy car) {
        this.car = car;
    }

    public void driver() {
        if (car != null) {
            System.out.print(name + "  " + age + " 岁 ");
            car.run();
        } else {
            System.out.println("error: car = null");
        }
    }
}

4.StrategyTest测试类:

public class StrategyTest {
    public static void main(String[] args) {

        PersonContext p1 = new PersonContext("小明", 22);
        //Context: 用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。
        SmallCarConcreteStrategy smallCar = new SmallCarConcreteStrategy();
        TruckCarConcreteStrategy truckCar = new TruckCarConcreteStrategy();

        p1.driver();

        p1.setCar(smallCar);
        p1.driver();

        p1.setCar(truckCar);
        p1.driver();
    }
}

控制台输出:

error: car = null
小明  22 岁 今天开着小汽车去旅游
小明  22 岁 今天开着大卡车去拉货

Android中策略模式应用场景

  1. Glide 的缓存策略
  2. ImageLoader 的生成图片文件的命名策略
  3. 网络切换和缓存切换策略
  4. Timer日志打印工具也用到策略模式
  5. Okhttp部分也用到
  6. 属性动画,set方法对插值器进行设置
  7. RecyclerView的setLayoutManager方法

END.

你可能感兴趣的:(设计模式——策略设计模式)