何为策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

策略模式的 UML 类图如下。

生活中的策略模式

策略模式在生活中非常常见:

1、比如在购物时,不同的节日,物品打折的程度也不相同。于是,打折就是一种策略。

2、还有我想听我的朋友奏乐《夜光下的凤尾竹》,我的朋友会钢琴,葫芦丝,笛子等等乐器,具体所使用什么乐器可以协商决定。于是,用什么乐器奏乐,就是一种策略。

3、旅行的出游方式,选择骑自行车、坐汽车。于是,每一种旅行方式都是一个策略。

4、……

代码举例

接下来,咱们就听听我的朋友来奏一首《夜光下的凤尾竹》吧。既然说到我的朋友会“钢琴,葫芦丝,笛子”三首乐器,那就每个乐器都让他奏乐一遍吧。

把每一种奏乐方式都实现一遍。

// 一个接口,抽取出通用的奏乐方法
interface MusicalInstruments {
    void play(String title);
}

// 分别实现三种不同的乐器
// 这是钢琴
class Piano implements MusicalInstruments {
    public void play(String title) {
        Systetm.out.println("使用钢琴弹《" + title + "》" );
    }
}

// 使用葫芦丝
class Hulusi implements MusicalInstruments {
    public void play(String title) {
        Systetm.out.println("使用葫芦丝吹《" + title + "》");
    }
}

// 使用笛子
class Flute implements MusicalInstruments {
    public void play(String title) {
        Systetm.out.println("使用笛子吹《" + title + "》");
    }
}

这是我的朋友,名字就拼音简写了。

class MyFriend {
    private String name = "czx";
    
    // 奏乐
    private MusicalInstruments instruments;
    
    public void setInstruments(MusicalInstruments instruments) {
        this.instruments = instruments;
    }
    
    public void play(String title) {
        instruments.play(title);
    }
    
}

快点奏乐吧,我等不及了(喜)。

class Main {
	public static void main(String[] s) {
        MyFriend myFriend = new MyFriend();
        
        myFriend.setInstruments(new Piano());
        myFriend.play("夜光下的凤尾竹");
        
        myFriend.setInstruments(new Hulusi());
        myFriend.play("夜光下的凤尾竹");
        
        myFriend.setInstruments(new Flute());
        myFriend.play("夜光下的凤尾竹");
    }
}

三种乐器都好听,但是我觉得用葫芦丝吹会更好听。☺️

使用场景

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

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

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

优点和缺点

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

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