详解JAVA面向对象的设计模式 (二)、策略模式

策略模式 Strategy

介绍

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

Intent

定义一系列算法,封装每个算法,并使它们可以互换。

策略模式可以让算法独立于使用它的客户端。

前言

本篇会以一个饲养员的饲养工作为例,一步步码到使用策略模式解决实际问题。

首先我们看看遇到类似如下的问题时,该怎么办。

  1. 有多种类别的多个宠物需要喂食。

  2. 只有一个人(对象)知道不同宠物应该根据它的体重喂多少食物。

本篇文章部分参考 :https://github.com/geekxh/hello-algorithm/blob/master/%E4%B8%93%E6%A0%8F/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F.md

你可以在这篇文章里找到最简洁的策略模式实现

一直膨胀的饲养员

最直接的实现方式,就是创建一个Feeder类(饲养员)。在里面实现一个Feed喂食方法,然后在喂食时,根据宠物种类和体重决定喂食量。

public class Feeder {
    public void feed(Cat cat) {
        System.out.println("我喂食了" + cat.getName() + " " +                       getCatFoodAmount(cat) + "斤食物");
    }
​
    public Integer getCatFoodAmount(Cat cat) {
        Integer weight = cat.getWeight();
        return weight/2;
    }
​
    // 输出结果
    // 我喂食了Tom 4斤食物
    public static void main(String[] args) {
        Cat tom = new Cat("Tom", 8);
        Feeder feeder = new Feeder();
        feeder.feed(tom);
    }
}

上面的代码很直接。但是这样做在拓展时就会出现问题了。如果饲养员以后要喂狗狗,要喂熊猫,要喂西几,要喂脑斧,就得一直往Feeder类中写入feed的重载方法和getXXXFoodWeight方法。饲养员类就逐渐变成了个胖子。太不优雅了。

那么如何解决饲养员日益膨胀问题

(0)

相关推荐

  • Python设计模式是什么?Python入门

    设计模式想必大家都比较熟悉,它是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式可以让代码更容易被他人理解.保证代码的可靠性,而且使用设计模式还需要遵循一定的原则.那么P ...

  • 通俗易懂系列 | 设计模式(五):策略模式

    介绍# 策略设计模式是行为设计模式之一.当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现. 策略模式的最佳示例之一是Collections.sort()采用Compara ...

  • [PHP小课堂]PHP设计模式之策略模式

    [PHP小课堂]PHP设计模式之策略模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • PHP设计模式之策略模式

    PHP设计模式之策略模式 策略模式,又称为政策模式,属于行为型的设计模式. Gof类图及解释 GoF定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换.本模式使得算法可独立于使用它的 ...

  • 2.7万 Star!最全面的 Python 设计模式集合

    [导语]:设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易地被他人理解.保证代码可靠性.python-patterns 则是使用 ...

  • 阿里面试官亲述:如何利用设计模式改善业务代码

    在业务部门的开发中,大多数的我们在完成的业务的各种需求和提供解决方案,很多场景下的我们通过 CRUD 就能解决问题,但是这样的工作对技术人的提升并不多,如何让自己从业务中解脱出来找到写代码的乐趣呢,我 ...

  • 设计模式-策略模式

    示例 策略模式是我们工作中比较常用的一个设计模式,但是初次理解起来可能会有点困难,因此我们还是先看一个例子,假设现在需要开发一个画图工具,画图工具中有钢笔,笔刷和油漆桶,其中,钢笔可以用于描边,但不能 ...

  • 设计模式——把类作为参数的抽象工厂模式

    今天给大家介绍一个非常简单的设计模式,一学就会,非常好用. 这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑.主要的用途一般是将一些复杂的类的创建过程整合在一起 ...

  • 详解JAVA面向对象的设计模式 (七)、装饰模式

    装饰模式 Decorator 装饰模式比较简单,我就不单独写实现例子了.参考设计图去实现不是什么问题.建议可以写一写找找感觉. 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修.相 ...

  • 详解JAVA面向对象的设计模式 (四)、外观模式

    外观模式 Facade 外观模式内容相对简单,就不写新的例子了.本篇文章摘录自 http://c.biancheng.net/view/1369.html 外观模式的定义与特点 外观(Facade)模 ...

  • 详解JAVA面向对象的设计模式 (一)、单例模式

    本系列,记录了我深刻学习设计模式的过程.也算是JAVA进阶学习的一个重要知识点吧. 与设计相关的代码会贴出,但是基础功能的代码会快速带过.有任何错误的地方,都欢迎读者评论指正,感谢.冲冲冲! 单例模式 ...

  • 详解人防工程如何施工(二)210507

    3 排水系统预埋 防爆波地漏 防空地下室的每个口部都设置了防护排水系统,它由集水井.排水管.防爆地漏等组成,底板施工时,该系统应预埋进底板. 底板上的集水井.排水管漏埋是无法整改的. 防爆地漏:战时能 ...

  • 3W 字详解 Java 集合

    开源前哨 93篇原创内容 公众号 数据结构作为每一个开发者不可回避的问题,而 Java 对于不同的数据结构提供了非常成熟的实现,这一个又一个实现既是面试中的难点,也是工作中必不可少的工具,在此,笔者经 ...

  • 详解花钱及其种类 (二)

    其它: 镇库钱 这是一种官钱局在开铸流通钱币之前,为镇钱库之邪,特意铸造的特大型超重钱币.有的在钱币上特地铸上"镇库"字样.存世最早的镇库钱当属南唐的大唐镇库.此后,历朝历代都有铸 ...

  • 详解三部六病十二单证

    小编导读 三部六病辨证论治体系,将人体划分为三个既相互独立,又相互联系的系统,即三部.每部中皆有寒.热.虚.实四类不同性质的病理反应,三部之中共有十二单证.十二单证是从六病分化而来的.本文带您了解这十 ...

  • 一文详解:足底跖筋膜炎的诊治策略

    一 引言 足底筋膜炎是成人足痛和足跟痛的最常见病因之一,占全部跟痛症患者的80%,是以跟骨结节内下侧疼痛和压痛为主要特征. 由于长时间站立或行走引起的足底跖腱膜生物力学过度使用引起, 是跖筋膜的慢性退 ...

  • 「愙斋书法」详解颜体笔法三十二式,一定不能错过

    「愙斋书法」详解颜体笔法三十二式,一定不能错过