“怎么了,鱼哥?”

  “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的却是一个X的,不说了,退货去。你先开讲吧,你说说就一个东西还装饰个什么劲儿。”(装饰模式石化中:这关我什么事儿撒。)恩,今天由我来讲,讲之前先来个段子:话说面条被追到一个理发店,出来一个方便面,然后追他的人一把抓住他就开打:小子(第四声),烫个头发我就不认识你了么?其实那人认错了,出来的真的是方便面,我认识的,因为方便面屁股上有胎记,恩。然后为什么会认错呢?没错,就是他认为面条“装饰了一下”。好了,我就是装饰。不过鱼哥的衣服真的不怨我、、、

装饰模式之自我介绍

  先来看下有关我的定义:Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.翻译过来的意思就是动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式想比生成子类更为灵活。下面的是我的类图:

  Component是定义一个对象接口,可以给这些对象动态的添加职责,ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在,至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。(装饰模式:容我抽根烟,喝杯水)

  讲到哪里来着?哦,想起来了。接下来我就谈谈Advantages和Disadvantages吧。

装饰模式之自我分析

  我嘛,比较均衡,何为均衡呢,就是优点和缺点一半一半,主要优点两个,如下:

  • 比静态继承更为灵活。比如说可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。
  • 可以避免在层次结构高层的类有太多的特征。

  主要缺点:

  • Decorator与它的Component不一样。Decorator是一个透明的包装,如果从对象标识观点出发,一个被装饰的组件与此组件有差别。因此不能依赖对象标识。
  • 使用装饰模式会产生很多小的对象。这对于它来说很难进行订制。而且排错也很困难。

装饰模式之实现

  光说不练假把式,既然如此,我就给你们露一手,这次就拿面条烫发来当栗子,首先是面条的抽象类:

1 public abstract class Noodles{
2     //抽象方法
3     public abstract void say();
4 }

  抽象类比较简单,只有一say的属性,接下来是具体的面条的类的实现:

1 public  class sayNoodles extends Noodles{
2     //抽象方法
3     @Override
4     public void say(){
5         System.out.println("我是面条");
6     }
7 }

  他主要就是实现了抽象类的方法,描述自己是面条,不是其它的东西。接下来的就比较有意思了,就是这次的重点抽象类,装饰,一般都是把装饰类作为一个抽象类,因为要装饰的东西不仅仅只有一种, 可能装饰很多东西,比如说一个面条可以先烫发,在染发,然后焗一下等等,写到一个实现类的话就太臃肿,不利于扩展等,所以最好用一个抽象类,然后具体实现不同的装饰再具体子类实现,下面就是一个装饰的抽象类: 

1 public abstract class Decorator extends Noodels{2     private Noodels noodles = null;3     //通过构造函数传递被修饰的东西4     public Decorator(Noodels nood)5     {6         this.noodles = nood;7     }8 9     //委托给被修饰着执行
10     @Override
11     public void say(){
12         this.noodles.say();
13     }
14
15 }

  接下来就是一个实现给面条烫发,大变方便面的装饰类了:

public class ConcreteDecorator extends Decorator{2     //定义被修饰者3     public ConcreteDecorator(Noodles nood){4         super(nood);5     }6 7     //定义自己的修饰方法8 9     private void dsay(){
10         System.out.println("我烫了头发");
11     }
12
13     //重写父类方法
14     public void say(){
15         this.dsay();
16         super.say();
17     }
18
19 }
 1 public class ConcreteDecorator extends Decorator{2     //定义被修饰者3     public ConcreteDecorator(Noodles nood){4         super(nood);5     }6 7     //定义自己的修饰方法8 9     private void dsay(){
10         System.out.println("我烫了头发");
11     }
12
13     //重写父类方法
14     public void say(){
15         this.dsay();
16         super.say();
17     }
18
19 }

  接下来可以通过测试类测试一下装饰后的效果:

1 public class Test{
2     public static void main(String[] args) {
3         Noodels noodels = new sayNoodles();
4         //进行装饰,烫发开始
5         noodels = new ConcreteDecorator(noodels);
6         noodels.say();
7     }
8 }

  好了,有关装饰模式的到此就没了。欲知后式(此为模式)如何,且听下回分解~(作者按:卧槽,竟然抢我台词,别理我,我想静静,别问我静静是谁)

装饰模式之应用场景

  • 不影响其他对象的情况下,以动态、透明的方式给单个对象增加职责。
  • 处理可以撤销的职责

转载于:https://www.cnblogs.com/yudar/p/4265264.html

设计模式之装饰模式(Java实现)相关推荐

  1. java设计模式之装饰模式_Java中的装饰器设计模式

    java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...

  2. java设计模式有哪些(java设计模式刘伟课后答案)

    Java设计模式之Flyweight模式是怎样的? Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对 ...

  3. 详解23种设计模式(基于Java)—— 结构型模式(三 / 五)

    目录 3.结构型模式(7种) 3.1.代理模式 3.1.1.概述 3.1.2.结构 3.1.3.静态代理 3.1.4.JDK动态代理 3.1.5.CGLIB动态代理 3.1.6.三种代理的对比 3.1 ...

  4. 设计模式之装饰模式20170726

    结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角 ...

  5. 设计模式六大原则-java复读记录

    设计模式六大原则-java复读记录 内容总览 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 设计模式 参考文献 内容总览 单一职责原则 里氏替换原则 依赖倒置原则 接口 ...

  6. 大话设计模式之装饰模式(python实现)

    大话设计模式之装饰模式 使用场景 定义 装饰模式结构图 python实现装饰模式 代码结构图 优点 使用场景 建造过程不稳定,不确定.把所需的功能按照正确的顺序串联起来进行控制. 新加入的东西仅仅是为 ...

  7. 设计模式之装饰模式详解(附应用举例实现)

    文章目录 1 装饰模式介绍 2 装饰模式详解 2.1 装饰模式结构 2.2 装饰模式实现 2.3 装饰模式应用举例 3 透明装饰模式和半透明装饰模式 1 装饰模式介绍 在生活中,我们往往会给图片增加一 ...

  8. 【源码分析设计模式 5】Java I/O系统中的装饰器模式

    一.基本介绍 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 二.装饰器模式的结构 1.Component,抽象构件 Component是一个接口或者抽象类,是定义我们 ...

  9. 设计模式之 装饰模式

    设计模式之 装饰模式 概述: 装饰模式(Decorator Pattern) 又叫装饰者模式:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也 ...

最新文章

  1. Tomcat学习总结(2)——Tomcat使用详解
  2. SpringCloud Hystrix初体验
  3. 查询 oracle_关于oracle和mysql数据库的查询问题
  4. Redis 基本操作一
  5. Addressable系统的加载资源API总结
  6. 启动tomcat报错,Failed to start component
  7. 题解报告:hdu 1575 Tr A
  8. android第十二步Pull解析器解析和生成XML内容
  9. Springboot2.2.6中的RSocket使用, RSocket 进行反应式数据传输
  10. 电脑、手机 自动化 键鼠操作( 类似按键精灵 )
  11. 使用 Android 开发 MQTT 客户端
  12. 虚拟机中Linux安装可视化界面
  13. 浅谈对社会工程学的认识
  14. 2018:视频标准混战的元年序幕
  15. win10 系统字体大小修改
  16. 如何把word文件转换成PDF格式?
  17. Win7远程桌面连接不上问题解决方案
  18. 豆瓣fm android,豆瓣FM for Android
  19. 二叉树寻找节点x的所有祖先
  20. JavaScript 实现textarea限制输入字数, 输入框字数实时统计更新,输入框实时字数计算移动端bug解决...

热门文章

  1. 2022-2028年中国激光脱毛仪行业市场调查研究报告
  2. Go 知识点(02)— channel 使用不当导致的 deadlock
  3. 利用牛顿法求平方根-Go语言实现
  4. msql每个数据前面添加某个字符串查询或者更新
  5. 条件随机场(CRF) - 1 - 简介
  6. LeetCode简单题之山羊拉丁文
  7. LeetCode简单题之整数的各位积和之差
  8. 操作系统常用词典(三)
  9. Android自定义View基本步骤
  10. 2021年大数据Spark(二十):Spark Core外部数据源引入