阅读 456

设计模式(10):策略模式

策略模式

定义

定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)

简单的说,就是让类根据传入的不同的具体策略(实现了策略接口,策略接口包含一个自己的算法)来调用不同的算法。同时让一个Context类来管理策略。

示例与代码

//定义策略接口,声明对应的算法
interface Strategy {
    void algorithm();
}

//实现不同的策略
class FirstStrategy {
    @override
    public void algorithm() {
        ...
    }
}

class SecondStrategy {
    @override
    public void algorithm() {
        ...
    }
}

//定义Context类来管理Strategy
class Context {
    private Strategy strategy;
    public void changeStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public void algorithm() {
        Strategy.algorithm();
    }
}

//使用
public class Main {
    public static void main(String[] args) {
        Context work = new Context();
        work.changeStrategy(new FirstStrategy());
        work.algorithm();
        
        work.changStrategy(new SecondStrategy());
        work.algorithm();
    }
}
复制代码

在Java开发中,ThreadPool用到了这个设计模式。最后一个参数RejectedExecutionHandler是一个接口,相当于就是我们这里的抽象策略,而使用的时候则要传入一个具体的拒绝策略。

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
复制代码

策略模式vs状态模式

从代码来看,基本和状态模式一模一样,其实这两种设计模式的总体思想都是一样的,都是为了去耦合。但是这两者对应不同的使用场景。具体来说,不同的状态可能不只是导致仅仅一个调用方法的改变,还有可能会改变一系列不同的调用方法,同时Context的其他成员变量值也有可能会变化,而且状态有可能自发的改变(有限状态机);而策略模式则更具体一点,不同的策略仅仅是调用不同的算法(algorithm),同时策略也不能自行变化,一般必须根据不同的场景使用不同的策略。

总结

相比于状态模式,策略模式更具有一般性一些,在实践中,可以用策略模式来封装几乎任何类型的规则,只要在分析过程中听到需要在不同实践应用不同的业务规则,就可以考虑使用策略模式处理,在这点上策略模式是包含状态模式的功能的,策略模式是一个重要的设计模式。

文章分类
后端