美高梅平台下载-美高梅娱乐平台登录

热门关键词: 美高梅平台下载,美高梅娱乐平台登录

对于扩展的话,通知观察者来扩展功能

日期:2019-10-06编辑作者:美高梅平台下载

咖啡店,客户可能会叫一种饮料,并且指定某些调料加入进去,比如深焙咖啡,用摩卡,奶泡,牛奶作为调料,计算出总价

使用情景:类的功能扩展

《Head First设计模式》读书笔记03 装饰对象

/** * 饮料父类 */public abstract class Beverage{ /** * 描述饮料的字段 */ protected String description = "Unknown Berverage"; public String getDescription() { return description; } /** * 计算价钱的方法,必须在子类中实现 */ public abstract double cost();}/** * 暗烤咖啡 */public class DarkRoast extends Beverage{ public DarkRoast() { description = "暗烤咖啡 DarkRoast"; // 描述此饮料 } /** * 返回此饮料的价钱 */ @Override public double cost() { return .99; }}

/** * 调料类,也就是装饰者 * * 为了让 装饰者 能够替代 被装饰者 ,因此 装饰者 继承 被装饰者 */public abstract class Condiment extends Beverage{ /** * 所有的装饰者类,都必须重新实现此方法,因为必须有不同的名称 */ @Override public abstract String getDescription();}/** * 摩卡调料 */public class Mocha extends Condiment{ private Beverage beverage; // 用来记住 被装饰者 ,也就是此调料要加在哪个饮料上 /** * 想办法把被装饰者记录在变量中 */ public Mocha(Beverage beverage) { this.beverage = beverage; } /** * 把被装饰者和装饰者的名称组合起来,比如:混合咖啡,摩卡 */ @Override public String getDescription() { return beverage.getDescription() + ", 摩卡调料 Mocha"; } /** * Mocha自身的价钱+饮料的价钱 */ @Override public double cost() { return 0.20 + beverage.cost(); }}/** * 豆奶调料 */public class Soy extends Condiment{ private Beverage beverage; public Soy(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ", 豆奶调料 Soy"; } @Override public double cost() { return .15 + beverage.cost(); }}

// 点一杯饮料Beverage beverage2 = new DarkRoast();// 用调料去装饰饮料beverage2 = new Mocha(beverage2);beverage2 = new Whip(beverage2);// 算出总价钱System.out.println(beverage2.getDescription() + " $" + beverage2.cost;

设计原则:类营改对扩展开放,对修改关闭

问题引入

  咖啡店的类设计:

  一个饮料基类,各种饮料类继承这个基类,并且计算各自的价钱。

  饮料中需要加入各种调料,考虑在基类中加入一些布尔值变量代表是否加入各种调料,基类的cost()中的计算各种调料的价钱,子类覆盖cost(),并且在其中调用超类的cost(),加上特定饮料的价钱,计算出子类特定饮料的价钱。

  缺点:类数量爆炸、基类加入的新功能并不适用于所有的子类、调料价钱的改变、新调料的出现都会要求改变现有代码;有的子类并不适合某些调料等情况……

  • 以上全用了继承,这里是利用继承达到类型匹配的目的,并不是获得行为。方便更有弹性的混合匹配
  • 每当需要新的调料,甚至是新的饮料,都可以新增并方便的加入
  • 并非一定要用接口,如果抽象类用的好好的,并且已经满足需求,就不用再去修改他
  • 会导致有很多的小类

体现案例一:
      观察者模式,通过添加新的观察者,通知观察者来扩展功能

 

Java I/O

简单说明:
     装饰者模式动态的将责任添加到对象上,若要扩展功能,装饰者提供了比继承更有弹性替代方案。

设计原则

  类应该对扩展开放,对修改关闭。

  我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。

  如能实现这样的目标,有什么好处呢?这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。

  要让OO设计同时具备开放性和关闭性,不是一件容易的事,通常来说,没有必要把设计的每个部分都这么设计。

  遵循开放-关闭原则,通常会引入新的抽象层次,增加代码的复杂度。

  我们需要把注意力集中在设计中最有可能改变的地方,然后应用开放-关闭原则。

类应该对扩展开放,对修改关闭,在不修改现有代码的情况下,就搭配新的行为

图片 1

 

动态的将责任附加到对象上,对于扩展的话,比继承更有弹性。

装饰者模式简单类图

用装饰者模式解决问题

  解决咖啡店饮料问题的方法:

  以饮料为主体,然后在运行时以调料来“装饰”饮料。

  比如,顾客想要摩卡(Mocha)和奶泡(Whip)深焙咖啡(DarkRoast):

  DarkRoast继承自Beverage,有一个cost()方法。

  第一步,以DarkRoast对象开始;

  第二步,顾客想要摩卡,所以建立一个Mocha装饰者对象,并用它将DarkRoast对象包装(wrap)起来;

  第三步,顾客想要奶泡,所以建立一个Whip装饰者对象,并用它将Mocha对象包起来;(Mocha和Whip也继承自Beverage,有一个cost()方法);

  最后,为顾客算钱,通过调用最外圈装饰者(Whip)的cost()就可以。Whip()的cost()会先委托它装饰的对象(Mocha)计算出价钱,然后在加上奶泡的价钱。Mocha的cost()也是类似。

总共分为四部分:
        1.被修饰类基本模型(接口或者抽象类)
        2.被修饰类子类(具体组件)
        3.修饰类基本模型(抽象类)
        4.修饰类子类(具体修饰类)
简单说明:
     1.装饰者与被装饰者必须实现相同的接口以保持类型一致,我们利用继承来达到"类型匹配",而不是获取行为(扩展功能)
     2.使用对象组合,让被修饰类(饮料)与修饰类(调料)弹性地加以混合与匹配(扩展功能)--依赖继承,那么类的行为只能在编译时决定,使用组合保证了在运行时决定。
     3.被修饰类基本模型可以是接口或者抽象类,灵活变通
具体实现:     

 

本文由美高梅平台下载发布于美高梅平台下载,转载请注明出处:对于扩展的话,通知观察者来扩展功能

关键词:

这些角色都是淘宝这个面上的不同的点,公众号

前言: 【发光weekly】是Dove新启动的周刊,以每周一篇的形式分享近期所学内容,既是一个干货记录平台,也是与大家...

详细>>

其实我想说,软件工程师要做的工作就是写代码

当你完全驾驭了计算机的输入设备以后,你需要进一步了解计算机的内部工作原理,不是让你把机器大卸八块,而是...

详细>>

设计模式在JAVA中的应用,左右根三范式

从url到页面显示过程 概述 客户端和服务器之间交互的时候,客户端不仅可以发送请求给服务器,还可以把一些内容传...

详细>>

方法的声明要如代码中所示的,开始网络请求图

RCTImage_Sequence_Diagram.jpg 上篇主要对 NSOperation 进行了拓展学习,下面开始着重学习SDWebImageDownloaderOperation。 iOS下将照片...

详细>>