likes
comments
collection

「设计模式」策略模式

作者站长头像
站长
· 阅读数 12

一、概述

策略模式(Strategy Pattern)定义了一组策略,分别在不同类中封装起来,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。比如我们要下班回家,会根据距离的不同来选择不同的出行方式(共享单车、坐公交、滴滴打车等等),这些出行方式即不同的策略。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

策略模式的3种角色

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

「设计模式」策略模式

二、优缺点

优点:1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点:1、策略类会增多。 2、所有策略类都需要对外暴露。

三、实现方式

以乘坐不同的交通工具(自行车、公交车、出租车多种策略)回家为例,简单实现策略模式。

「设计模式」策略模式

策略抽象类

public interface Strategy {
    void goHome();
}

具体策略类

public class TaxiStrategy implements Strategy{
    @Override
    public void goHome() {
        System.out.println("公司报销,乘坐出租车回家");
    }
}

public class BusStrategy implements Strategy{
    @Override
    public void goHome() {
        System.out.println("省钱省力,坐公交回家");
    }
}

public class BicycleStrategy implements Strategy{
    @Override
    public void goHome() {
        System.out.println("为了省钱,骑自行车回家");
    }
}

环境类(策略选择器)

public class Context {
    private Strategy strategy;

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

    public void go(){
        strategy.goHome();
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        Context context = new Context(new BicycleStrategy());
        context.go();

        Context context1 = new Context(new BusStrategy());
        context1.go();

        Context context2 = new Context(new TaxiStrategy());
        context2.go();
    }
}

输出结果

为了省钱,骑自行车回家
省钱省力,坐公交回家
公司报销,乘坐出租车回家

四、常见应用场景

(1)如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

(2)一个系统需要动态地在几种算法中选择一种。

(3)如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。