`
yangshen998
  • 浏览: 1248525 次
文章分类
社区版块
存档分类
最新评论

java 设计模式 学习笔记(5) 装饰模式

 
阅读更多

装饰模式: 动态地给一个对象添加额外的职责。就增加功能来说,装饰模式比增加子类更加灵活。

我承认我看了《大话设计模式》 中的装饰模式,花了一个小时才消化掉,为此,我改写了《大话设计模式》 的例子以便加深印象。

在这里,我简单的以给某个人类穿衣服裤子等行为来表示对一个对象的装饰动作。

1. 根据面向接口编程的原则,建立一个 Humen 类,这个类是一个抽象类,并有一个抽象方法 dress() ,是人类都要穿衣服吧。

2. 建立Baby 类作为 Humen 的子类,并重写 dress 方法。不过Baby 怎么重写dress 方法 ?当然是哭闹说:“我要起床,要穿衣服”。实际上他是不会给自己穿衣服的。

3. Baby 要起床,但是不会自己穿衣服,这个时候就需要其他人来为 Baby 穿衣服。但是 Baby 今天说我要先穿外套,然后再穿裤子,明天说我要先穿裤子,然后穿外套。或者说今天我就只穿裤子,不穿外套了。对于Baby 的要求,无人能够拒绝。

对于Baby 的不同穿衣要求,我们可以先建立一个的 Decorator 类,用来负责为 Baby 穿衣服。

Decorator 作为抽象装饰类,表示这个类还需要被继承,并希望其子类能够扩展Humen 的功能。因为 Decorator 是抽象类,其必须被继承。同时 Decorator需要保存一个 Humen 引用,这个Humen 就是装饰类需要去装饰的对象。

4. 既然有抽象类,那么就建立一个JacketDecorator 类作为 Decorator 子类,JacketDecorator 同时也是 Humen 的孙子类,因此也必须重写 dress () 方法,它的 dress()方法 就是听到 Baby 说要起床后就给 Baby 穿 Jacket 。

5. 有了穿 外套的类,那还需要一个 为Baby 穿裤子的类,功能和JacketDecorator 类似

6.提一个先给Baby 穿外套,再穿裤子的需求 编写一个测试的类,来验证试验的正确性 :

结果是 :

讨论:

在最后的测试类中,有一个令人容易迷惑的地方:

jDecorator.setHumen(baby);
tDecorator.setHumen(jDecorator);
tDecorator.dress();

为什么能够做到先穿外套,再穿裤子?

首先 jDecorator 中保存了一个 Baby 的对象引用 baby

tDecorator.setHumen(jDecorator); 表示 tDecorator 又保存了一个 JacketDecorator 对象的引用 tDecorator

这三个对象的关系是 jDecorator 保存了 baby ,tDecorator 保存了 jDecorator 。

TrouserDecorator 类中的 dress() 方法:

从代码可以得知,首先要 执行 父类的 dress() 方法,然后才能执行 TrouserDecorator 的装饰方法,也就是 addTrousers() 方法。回溯到 TrouserDecorator 的父类 Decorator 的 dress()方法:

humen 对象就是通过 setHumen 方法注入进来的 humen。 而在测试类里,Decorator 中的humen 就是 baby ,baby 先执行了 dress()方法,说“ i wil get up”

然后再执行 JacketDecorator 类自己的 addJacket()方法,给 baby 穿 外套

JacketDecorator 的dress() 方法执行完了,才能轮到TrouserDecorator 类执行自己的addTrousers() 方法,给baby 穿裤子。

再论:

如果想换个需求 : 先给Baby 穿内裤,不小心把baby 惊醒了,然后给baby 穿裤子,再穿外套。

这个时候,我们就需要增加一个 给 Humen 穿内裤的装饰类: BriefsDecorator
BriefsDecorator 类继承了 Decorator ,并重写dress() 方法,重写内容是先执行自己的 addBriefs() 方法,然后执行父类的dress()方法。

通过这样的顺序就能保证先执行自己的 addBriefs() 方法,也就满足给baby 穿内裤,不小心 让Baby 惊醒的需求。

这个时候,需要改写测试类,改写后的类如下:

解释 : 因为穿内裤动作在前,所以 bDecorator.setHumen(baby); 这样就保证了先执行 穿内裤,再执行baby 惊醒

tDecorator.setHumen(bDecorator); 将bDecorator 注入到 tDecorator ,保证了 接着执行 addTrousers() 方法

jDecorator.setHumen(tDecorator); 将 tDecorator 注入到jDecorator ,保证了 最后执行 addJacket() 方法。

分享到:
评论

相关推荐

    尚硅谷设计模式源码笔记课件.zip

    本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式 1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML...

    java-design-patterns:Java 设计模式学习笔记

    Java Design PatternsJava 设计模式学习笔记,简单易懂,每个模式都有相应的代码示列,帮助学习理解。在线阅读地址:设计原则创建型模式作用:将创建与使用代码解耦结构型模式作用:将不同的功能代码解耦桥接模式...

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    设计模式是一种解决软件设计问题的经验总结,是在软件开发过程中经过反复验证的最佳实践。设计模式提供了一套通用的解决方案,可以帮助开发人员更好地组织和设计代码,提高代码的可读性、可维护性和可扩展性。 设计...

    java8源码-akangaroo:学习笔记,完善中

    学习笔记较长,如果想查看文章的目录,chrome浏览器可以配合简悦插件使用,或者下载到本地使用Typora打开。 :hot_beverage: Java基础 Java容器 Java并发 数据结构和算法 数据结构 树 图 算法 分治 动态规划 回溯 ...

    java-patterns:Java 23种基本的设计模式整料整理学习,责任链模式过滤器,工厂模式BeanFactory,观察者模式ContextListen等。结合Spring源码理解学习

    describe:设计模式学习笔记 逻辑结构图 代码结构图 设计模式简述 创建型模式,共五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式,共七种:适配器模式,装饰器模式,代理模式,...

    java-design-patterns:java 学习模式

    Java Design Patterns 学习笔记 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    notes:JavaJava后端工程师的学习笔记https

    常用设计模式 单例模式 , 工厂模式 , 装饰者模式 , 代理模式 ... Java基础核心 JVM , 集合 , 类型 ,关键字... Java高级特性 多线程、锁、并发 框架 Spring , Mybatis , SpringBoot , SpringMVC ... 中间件 RPC , MQ...

    hope::artist_palette: Java 学习笔记

    避坑笔记2021CICDCI/CD流程以及原理说明设计模式:策略模式单例模式工厂模式装饰器模式观察者模式适配器模式模板方法模式SpringBoot:SpringBoot(1):公共配置SpringBoot(2):generatorSpringBoot(3):docker部署...

    java8源码-jcohy-study-sample:个人学习整理

    Ps:Java设计模式 [设计原则] [单一职责原则] [里氏替换原则] [依赖倒转原则] [接口隔离原则] [迪米特法则] [合成复用原则] 设计模式 创建型模式(5种) 结构型模式(7种) 关系型模式(11种) 适配器模式、装饰模式、代理...

    左程云leetcode-hjLearningNotes:hj学习笔记

    第一部分:设计模式 & UML 简单工厂 工厂方法模式 抽象工厂模式 策略模式 责任链模式 命令模式 模板方法模式 适配器模式 代理模式 外观模式 组合模式 装饰模式 享元模式 桥接模式 Builder模式 状态模式 解释器模式 ...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    java8集合源码分析-AndroidLearn:Android学习笔记

    java8 集合源码分析 Java 内存模型 并发/多线程 类加载 垃圾回收 Android UI 生命周期 ...ActivityManagerService ...设计模式 代理模式 装饰者模式 架构 MVVM 组件化 JavaScript Linux 版本控制 实战

    leetcode题库-study-prj:学习日记:rocket:

    Java学习笔记 :rocket: Author Samin Date 2019-11-12 Desc 分享一下自己如何收集整理分类知识点,旨在帮助开发者们学会整理自己的知识库 [TOC] leetcode :blue_book: 力扣刷题记录 :paperclip: algorithms 算法刷题...

    Design-Patterns

    GoF的23种设计模式学习笔记,结合自己在实现工作项目中用到的情况,讲解设计模式。 职责链模式(Chain of Responsibility) 讲解点击 里面的Demo分别为 、 PPT下载点击 单例模式(Singleton) 讲解点击  代码点击 工厂...

Global site tag (gtag.js) - Google Analytics