大白话设计模式-策略模式

129 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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!

总结

在实际开发过程中,策略模式算是用的比较多的设计模式了,各位大大们要掌握一下,才不会和菜鸟一样被老板嫌弃代码不好

优点

  • 降低了算法类的职责,使各个算法可以独立变化并互相替换。而且使得增加新的算法变的很容易,使得程序可扩展可维护性增强

缺点

  • 增加了类,让程序从局部来看,变得更加的复杂