美文网首页Java WorldJava设计模式互联网从业者的日常
老王讲设计模式(一)——策略模式

老王讲设计模式(一)——策略模式

作者: 大树林里的小树 | 来源:发表于2016-12-30 00:32 被阅读1903次

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

老王最近接到一个工作,上级领导安排他对大家进行一次关于设计模式的科普培训。小蔡被安排座位老王的助手,一起准备这次培训。

小蔡以前从来不知道什么叫做设计模式,一听就感觉高深莫测,有一种不明觉厉的感觉。

于是小蔡问老王:“老王啊,什么叫做设计模式呢?”

老王回答:“设计模式,简单来将,就是一套经验,一套总结,没什么玄乎的。不过学了设计模式之后,对我们未来的工作是大有好处的。”

小蔡接着问:“那你先给我讲讲呗,我作为助手,什么都不知道,这让别人指导了,可就丢脸了。”

老王说:“好啊, 那我们今天先来说说策略模式吧。策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。”

小蔡两眼直发愣:“老王,你说的都是些啥,火星语吗?完全听不懂。”

老王说:“先别着急,刚只是跟你说了一下策略模式的定义,接下来给你举一个例子,你就明白了。对了,你知道咱们公司人称“冰雪美人”的程妹妹最喜欢吃什么不?”

小蔡单手一辉说:“她啊。最喜欢吃火锅,不过她的口味可是很挑剔的,咋的?你对她有意思?”

老王没有瞧小蔡,接着说:“好的,她喜欢吃火锅,而且口味挑剔。那好,我用策略模式来满足她喜欢吃火锅的要求。”

小蔡一下兴奋起来:“吃个火锅都能和设计模式联系起来?”

老王接着说:“假设公司里的张董想要追求程妹妹,想请程妹妹到家里吃火锅。张董得先请一个厨师,对吧?那么我们就来定义一个接口,告诉张董什么叫做厨师。”

//这是一个厨师
public interface Cook {

  //是厨师就得会做火锅
  HotPot cook();
}

小蔡打趣道:“张董还不知道厨师是干嘛的?需要我们告诉他吗?”

老王白了小蔡一眼,接着说:“张董现在知道什么是厨师了。于是张总按照这个标准到厨师学校去找厨师,到了厨师学校,他发现了三个厨师,一个四川厨师,一个北京厨师,一个潮汕厨师。”

//北京厨师
public class CookOfBeijing implements Cook {

  //北京厨师做的就是北京火锅
  @Override
  public HotPot cook() {
    HotPotOfBeijing hotPot = new HotPotOfBeijing();
    return hotPot;
  }
}

//潮汕厨师
public class CookOfChaoshan implements Cook {

  //潮汕厨师做的就是潮汕火锅
  @Override
  public HotPot cook() {
    HotPotOfChaoshan hotPot = new HotPotOfChaoshan();
    return hotPot;
  }
}

//四川厨师
public class CookOfSichuan implements Cook {

  //四川厨师做的就是四川火锅
  @Override
  public HotPot cook() {
    HotPotOfSichuan hotPot = new HotPotOfSichuan();
    return hotPot;
  }
}

小蔡留着口水问:“原来火锅也分地区的啊?那这些火锅有什么区别呢?”

老王习惯性的呷了一口茶后说:“别着急,你不知道他们的区别,咱们张董也不知道呢,我们继续来看看这些火锅有些什么区别和特点。”

//北京火锅
public class HotPotOfBeijing extends HotPot {

  //北京老火锅,可是铜火锅,以前皇帝都用这个。
  public HotPotOfBeijing() {
    super("铜火锅啊~铜火锅~");
  }
}

//潮汕火锅
public class HotPotOfChaoshan extends HotPot{

  //潮汕的牛肉火锅,味道鲜香棒
  public HotPotOfChaoshan() {
    super("吃牛肉啊~吃牛肉~");
  }  
}

//四川火锅
public class HotPotOfSichuan extends HotPot{

  //四川火锅的特点是:麻辣烫
  public HotPotOfSichuan() {
    super("麻辣烫啊~麻辣烫~");
  }
}

小蔡:“现在火锅的特点知道了,厨师也有了,然后开始做火锅了?”

老王:“厨师有了。火锅知道了。但是还需要一个东西,才能做火锅,那就是厨房,对吧?我们来看看厨房是什么样的。”

//厨房,做火锅的地方
public class Kitchen {
  //掌勺的主厨
  private Cook cook;

  //厨师进厨房了
  public Kitchen(Cook cook) {
    super();
    this.cook = cook;
  }

  //开工,做一个火锅出来
  public HotPot cook(){
    return cook.cook();
  }
}

小蔡打断了老王:“老王,现在厨师,厨房,火锅全有了,听得我肚子都饿了,但是我们要讲的策略模式在哪里呢?”

老王又呷了一口茶,说:“别着急嘛,准备工作做好了,接下来我们就开始吃火锅,哦,不对,应该是让张董去追程妹妹,追程妹妹总得讲点策略吧。这就是我们要讲的策略模式了。”

//开始追求程妹妹
public class Chasing {

  //追求活动
  public static void main(String[] args) {
    //叫来北京厨师
    CookOfBeijing cookOfBeijing = new CookOfBeijing();
    //让北京厨师进厨房
    Kitchen kitchen = new Kitchen(cookOfBeijing);
    //做出北京火锅
    HotPot hotPot = kitchen.cook();

    //问问程妹妹是否喜欢北京火锅
    //结果发现程妹妹不喜欢北京火锅

    //叫来潮汕厨师
    CookOfChaoshan cookOfChaoshan = new CookOfChaoshan();
    //让潮汕厨师进厨房
    kitchen = new Kitchen(cookOfChaoshan);
    //做出潮汕火锅
    hotPot = kitchen.cook();

    //问问程妹妹是否喜欢潮汕火锅
    //结果发现程妹妹不喜欢潮汕火锅

    //叫来四川厨师
    CookOfSichuan cookOfSichuan = new CookOfSichuan();
    //让潮汕厨师进厨房
    kitchen = new Kitchen(cookOfSichuan);
    //做出潮汕火锅
    hotPot = kitchen.cook();

    //问问程妹妹是否喜欢四川火锅
    //发现程妹妹很喜欢四川火锅
    //于是张董和程妹妹开始开心的吃火锅
    //一直吃到23:26
    //然后出去散步,看午夜场电影………………
  }
}

老王又呷了一口茶,说道:“小蔡,你看,这就是策略模式。首先定义一个接口,这就相当于是制定了一条策略,然后依照这个策略编写不同的实现类,就相当于一条策略有不同的实施办法。这个模式的优势在于可以动态的改变对象的行为。再聚个例子,比如京东针对它的会员,有不同的会员算法,比如金牌会员算法,银牌会员算法,铜牌会员算法。这就是针对会员算法这一个固定的策略,有了不同的实现。”

小蔡投来羡慕的目光:“老王,你真是太有才了。这样的例子,我能懂,不过我还有点迷糊,不知道策略模式该如何去做,你能帮我归纳一下吗?”

老王:“可以啊。策略模式主要有3个角色,1.环境类(Context):就是刚才说道的厨房。2. 抽象策略类(Strategy):这个是厨师接口。具体策略类(ConcreteStrategy):这就是那三个厨师。我们用一个图来表示,能够更加清晰易懂。”

Paste_Image.png

小蔡:“老王,我发现另一个事儿。”

老王:“什么事儿?”

小蔡:“我肚子饿了。今天你得请我吃火锅。”

老王:“好好好,走嘛,今天晚上我们吃火锅。吃完之后,我们也去看一场电影哇?”

小蔡:“那得看火锅好不好吃了。哈哈”

老王/小蔡求打赏

更多内容,正在赶来,敬请关注“小蔡和老王的技术日常”。
PS:小蔡和老王的技术日常,已经建立QQ群,欢迎各位小伙伴通过发送简信的方式联系我们,询问QQ号。

相关文章

网友评论

  • 媛乐乐儿:感觉策略模式跟代理模式很像啊
  • 媛乐乐儿:策略接口,策略接口实现类,环境类
  • 理想是一盏灯:策略模式,说白了,就是多态,父类的引用,指向子类的对象,子类覆写父类的方法,达到new不同的子类,就调用不同的实现逻辑的目的
  • 74069c10ad31:这不就是多态吗?
  • _Static_:通俗易懂,明白了不少
  • 梧桐树下承诺::smile: 老王和小蔡有激情
  • 幺鹿:策略模式 将if-else的后置判断前移到 上下文中。由此,上下文的改变自动会引起策略的变更。如:例子中的不同的厨师做不同的火锅。如果把火锅比作策略,厨师就是不同的上下文。

    这样 厨师.cook()方法就自动关联(北京厨子对北京火锅等)。
  • 神佑骑士:终于看懂了,求更新
  • 1862d37bb7a5:哇哦,通俗易懂啊。楼主运用小故事的形式把设计模式讲的这么透彻,大赞。
  • 4a2115d066d8:结合实际场景,让人理解起来更容易
  • 小呀么小问号:通俗易懂
  • 菲利柯斯:设计模式,有时候看懂了,一知半解,但是不知道怎么在项目中运用,
    大树林里的小树:@菲利柯斯 老王答:别为了模式而模式。在适当的场景,合适的选择。举个例子,在移动开发中,终端的内存往往比较小,这个时候就需要考虑内存的消耗。同时,移动开发一般都是开发一个终端程序,终端程序的数据库的数据量一般不会很大,所以为了避免脏数据。可以考虑只用一个对象来进行数据访问工作。综上所述,单例模式就是适合的。
    菲利柯斯:问老王,设计模式该如何运用到项目中
    大树林里的小树:@菲利柯斯 老王说:不是不晓,只是时候未到。:grin:
  • minterjiang:几年前看过大话设计模式。看不懂。
    大树林里的小树: @minterjiang 那现在呢?如果依然有问题,老王很乐意和你交流。
  • 富一代路上:通俗易懂,赞一个
    大树林里的小树:帮老王分享分享,推荐推荐呗:relaxed:
  • 1b9f68c38185:午夜场电影…

本文标题:老王讲设计模式(一)——策略模式

本文链接:https://www.haomeiwen.com/subject/vmmpvttx.html