“工厂模式封装了对象,策略模式封装了变化”这是我学习完工厂模式和策略模式之后的一个简单理解。
策略模式主要由三部分组成上下文类+算法接口+实现算法接口的实现类。
以下是百度的一个策略模式类图,因为很简单就没有自己再画:
看完类图,我们下面以一个小例子来说明以下具体的策略模式:
就以我们每天上班出行为例,我们要出行交通工具就有各种选择比如自行车,摩托车,小汽车等,其中上班出行就是对应策略模式中的策略接口,我们各种的出行工具就是我们对应策略的算法,下面我们看一下具体的实现代码
首先是算法的接口类:
public interface TravelStrategy {
/**
* 出行工具
*/
void travelTool();
}
接口类是策略模式的核心,每个具体的算法实现类都要继承接口类实现其方法,接下来是算法的具体实现类:
public class Bicycle implements TravelStrategy{
@Override
public void travelTool() {
System.out.println("这里是自行车");
}
}
public class Motorcycle implements TravelStrategy{
@Override
public void travelTool() {
System.out.println("这里是摩托车,");
}
}
public class Car implements TravelStrategy {
@Override
public void travelTool() {
System.out.println("这里是汽车。");
}
}
算法实现类的设计使我们可以轻松的应对代码中的算法改变,比如此时如果我们的上班出行方式多了一种公交出行的话,那我们只需要增加一个公交车的算法实现就可以了。
最后就是策略模式的最后一部分上下文类:
public class Context {
private TravelStrategy travelStrategy;
public Context(TravelStrategy travelStrategy) {
this.travelStrategy = travelStrategy;
}
public void getTravelTool(){
travelStrategy.travelTool();
}
}
在这里其实我也有一个疑问,就是策略模式中的上下文类具体的作用到底是什么,如果说我们要应对算法上的变化那么我们直接new对应的算法实现也可以啊,后来我仔细的想了一下关键点应该就在于上下文中的方法上了,上下文中的策略接口属性是我们变化的方法,那么上下文中的其他方法则是我们抽象的不变的部分,就好比我们每天上下班除去我们去公司的交通工具可能发生变化,剩下的其他部分我们都是不变的朝九晚五或者996,所以其他不变的部分就是我们策略模式中其他方法要做的事。
这样我们在客户端调用时,如果我们的出行工具发生了变化,在客户端的调用也就察觉不出来了,这才是策略模式的精髓所在吧。
public class Main {
public static void main(String[] args) {
Context context;
context = new Context(new Bicycle());
context.getTravelTool();
context = new Context(new Motorcycle());
context.getTravelTool();
context = new Context(new Car());
context.getTravelTool();
}
}
客户端我们在调用的时候其实只要关注变化的算法就好了。
其实策略模式是一种定义了一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的方法,减少了各种算法类与使用算法类之间的耦合。
但是我有个个人的建议就是,设计模式虽然很好但是不要为了设计而设计,策略模式主要是应对算法经常发生变化的功能,如果我们的功能中算法不会发生变化就算我们能析取出公共功能和算法那么我们也没必要应用策略模式。不过这也只是我本人的一点小建议,具体怎么使用还要看我们自己。
我是一个小码农,大家一起学习一起进步。