设计模式-行为型模式-策略模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-行为型模式-策略模式相关的知识,希望对你有一定的参考价值。

策略模式

在实际工作中我用到了策略模式,但为什么要有环境角色呢?

这里我贴上英文对含义的介绍,

The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

然后看看这种设计模式的组成,

一般的,策略模式主要分为以下三个角色: 
    1. 环境角色(Context):持有一个策略类引用

         存在的优点:(1)必要时可以增加系统的安全性,减少代码的冗余(下文有详解)。
    2. 抽象策略(Strategy):定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。一般的,我们使用接口或抽象类实现。 
    3. 具体策略(ConcreteStrategy):实现抽象策略类中的相关的算法或操作。

我贴上简单的实现

抽象类(抽象策略)

public abstract class AbstractStrategy {
    public abstract void algorithm();
}

具体策略-A

public class ConcreteStrategyA extends AbstractStrategy {

    @Override
    public void algorithm() {
        System.out.println("Strategy A");
    }
}

具体策略-B

public class ConcreteStrategyB extends AbstractStrategy {

    @Override
    public void algorithm() {
        System.out.println("Strategy B");
    }
}

环境角色怎么用的呢?

public class Context {
    private AbstractStrategy strategy;

    public Context(AbstractStrategy strategy) {
        this.strategy = strategy;
    }

    public void algorithm() {
        this.strategy.algorithm();
    }
}

使用的时候我们这样用

public static void main(String[] args) {
    //Strategy Pattern Demo
    Context context = new Context(new ConcreteStrategyA());
    context.algorithm();

    context = new Context(new ConcreteStrategyB());
    context.algorithm();
}

细心如你应该会想我使用如下代码也能实现,Context的存在是为了什么?

AbstractStrategy abstractStrategy = new ConcreteStrategyA();
abstractStrategy.algorithm();

abstractStrategy = new ConcreteStrategyB();
abstractStrategy.algorithm();

这里我们看看第一种现象:

修改抽象策略中的方法

public abstract void algorithm(int number);

修改具体策略的实现

@Override
public void algorithm(int number) {
    System.out.println(number);
};

看到这里你会不会觉得这个参数number有安全隐患,传进来的合法吗?于是我要判断,so,你可以每个具体的策略中都写一段相同的逻辑去判断下,或者传参时判断下,那么不想copy的你此刻是不是想找个地方统一判断一把,是的Context(译为上下文,在.NET中有DBContext。。。)此刻显示出重要性,我们大可在构造函数中去判断,那么我们总结下Context的第一个优点:必要时可以增加系统的安全性,减少代码的冗余。还有什么优点呢?需要我们自己去在实际的Coding中总结,希望大家共同探讨。

 这里需要和工厂模式进行比较,加以区别。

以上是关于设计模式-行为型模式-策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Python 设计模式 — 行为型模式 — 策略模式

行为型设计模式之策略模式

设计模式 行为型模式 -- 策略模式(定义结构示例分析)

手撸golang 行为型设计模式 策略模式

设计模式——行为型模式之策略模式

设计模式-行为型模式-策略模式