开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
背景:菜鸟的上一次代码改进使用了简单工厂模式,但是违背了开闭原则——对扩展开放,对修改关闭,老板虽然没有说,勉强的接受了,但是还是抛下了一个难题:怎么样不修改源代码的情况下,当我需要增加业务的时候,可以更简单的写出来呢?
策略模式
这是一个使用率非常高的模式,可以灵活的替换算法。达到我们的开闭原则。
难度:两颗星
背景
这可把菜鸟难坏了,想得他是夜不能寐,用他那小小脑袋瓜,好像是没有想出来。不过还好,他有一个大佬可以询问,但是现在有点晚了,晚上九点了。不管了,先打了再说!
- 菜鸟 :喂,大大,我有个问题想问你呀,我老板又给我出难题了,快救救我吧,等会我就失业了呜呜呜!
- 大佬 :这个需求不是很简单吗? 这都不会怎么混我们代码界呢?
- 菜鸟 :大佬教教我吧,我想要那个变强不变秃!
- 大佬 :那不行,我就要让你变得和我一样秃,才能变强
大佬教学
- 大佬 : 首先我们来看一下你这个问题,如果你使用的是简单工厂的设计模式,那么当你需要增加新的业务的时候,就需要更改Switch中的代码以及增加实现类。
public static IWork WorkFactory(String workName) {
IWork work;
switch (workName) {
case "口罩":
work = new MouthMuffle();
break;
case "螺丝":
work = new Screw();
break;
case "手机":
work = new Phone();
break;
default:
work = null;
System.out.println("没有这个业务啊兄弟!");
break;
}
return work;
}
-
大佬 : 那就不符合我们的开闭原则了,那怎么进行改进呢?这里就可以使用到我们经常在业务中使用的策略模式
-
大佬 : 首先,我们在上面的代码中再新增一个Context类,接受我们的IWork接口并调用
public class Context {
IWork _work;
public Context(IWork work) {
this._work = work;
}
public void MakeWork() {
_work.work();
}
}
- 大佬 : 那这么一来,我们在Mian方法中就可以这样子调用了
public class AssemblyLine {
public static void main(String[] args) {
Person person = new Person();
person.name = "菜鸟";
//在这里指定要创建什么对象
Context context = new Context(new Phone());
context.MakeWork();
}
- 大佬 :这样一来,就算以后要扩展无数个业务,只需要继承并实现IWork接口,就可以了。
- 菜鸟 :哇,为大佬打call!!
- 大佬 :基本操作基本操作,在业务中,用的比较多就是这个策略模式了。你要好好学一下啊!
菜鸟把代码一修改,老板笑呵呵,开始了画饼:菜鸟啊,你好好跟着我干,明年就让你提车,三年包你在这里买房,五年我们公司就上市,到时候让你当CTO!
总结
在实际开发过程中,策略模式算是用的比较多的设计模式了,各位大大们要掌握一下,才不会和菜鸟一样被老板嫌弃代码不好
优点
- 降低了算法类的职责,使各个算法可以独立变化并互相替换。而且使得增加新的算法变的很容易,使得程序可扩展可维护性增强
缺点
- 增加了类,让程序从局部来看,变得更加的复杂