装饰设计模式

  装饰设计模式概述

  装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案

  优点

  使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能

  缺点

  正因为可以随意组合,所以就可能出现一些不合理的逻辑

装饰设计模式,就是继承的替代方案。

例子:

  手机的例子:(装饰设计模式)

现在用个电脑类来写代码例子:

  

  1、现在有个电脑的规则接口:

  1. /**
  2. * 这是电脑类的规则接口
  3. *
  4. * @author LZL
  5. *
  6. */
  7. public interface Computer {
  8. // 电脑用来办公
  9. public void office();
  10. }

  2、制作了一台ThinkPad电脑:(实现电脑规则接口的实现类)

  1. /**
  2. *
  3. * 实现了电脑规则的接口
  4. *
  5. * @author LZL
  6. *
  7. */
  8.  
  9. public class ThinkPad implements Computer {
  10.  
  11. public void office() {
  12. System.out.println("ThinkPad可以办公");
  13. }
  14.  
  15. }

  3、我想用这台电脑在办公后编程,那么我就需要一个总的装饰类,以及一个编程的装饰类

  总的装饰类:(由于是对电脑进行装饰,所以要实现电脑规则的接口)

  1. /**
  2. * 这是对电脑进行装饰的装饰类
  3. *
  4. * @author LZL
  5. *
  6. */
  7. public class CPDecorate implements Computer {
  8.  
  9. // 接收一个电脑类
  10. private Computer cp;
  11.  
  12. public CPDecorate(Computer cp) {
  13. this.cp = cp;
  14. }
  15.  
  16. // 实现电脑类的方法
  17. public void office() {
  18. this.cp.office();
  19. }
  20.  
  21. }

  编程的装饰类:(对电脑增加编程功能的装饰类,得继承电脑的装饰类来实现)

  1. /**
  2. * 这是对电脑增加编程功能的装饰类,得继承电脑的装饰类来实现
  3. *
  4. * @author LZL
  5. *
  6. */
  7.  
  8. public class ProGramme extends CPDecorate {
  9.  
  10. public ProGramme(Computer cp) {
  11. super(cp);
  12. }
  13.  
  14. // 调用电脑的办公功能
  15. public void office() {
  16.  
  17. super.office();
  18. System.out.println("还可以编程");
  19. }
  20.  
  21. }

  同理,我想要在办公前听下音乐,就要一个音乐的装饰类:

  1. public class Music extends CPDecorate {
  2.  
  3. public Music(Computer cp) {
  4. super(cp);
  5. }
  6.  
  7. public void office() {
  8. System.out.println("听音乐");
  9. super.office();
  10. }
  11. }

  最后,我运行这台电脑:

  1. public class ComputerDemo {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. // 创建电脑对象
  6. Computer cp = new ThinkPad();
  7. cp.office();
  8. System.out.println("--------");
  9.  
  10. // 我要办公后来编程,那么就需要一个装饰类来实现
  11. // 创建装饰后的电脑对象
  12. CPDecorate cpd = new ProGramme(cp);
  13. cpd.office();
  14. System.out.println("------");
  15.  
  16. // 我想在办公前听音乐,再来个装饰类
  17. cpd = new Music(cp);
  18. cpd.office();
  19. System.out.println("------");
  20.  
  21. // 我想在办公前听音乐,办公后编程
  22. cpd = new Music(new ProGramme(cp));
  23. cpd.office();
  24. }
  25.  
  26. }

  其实,我们之前在IO流就已经用过了装饰设计模式。

理解下面:

比如:

  输入字节流转换成输入字符流:(一次性只能读取一个字节  →  一次性可以读取一个字符)

  1. InputStreamReader isr = new InputStreamReader(is);

  然后再转换成高效输入字符流:(一次性只能读取一个字符   →  一次性可以读取一行字符)

  1. BufferedReader br = new BufferedReader(isr);

  上面两个合起来: 输入字节流转换成高校输入字符流(一次性只能读取一个字节  →   一次性可以读取一行字符)

  1. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  还有,输出字节流转换成高效输出字符流

  1. BufferedWriter bw = new BufferedWriter((newOutputStreamWriter(
  2. System.out)));

java 28 - 3 设计模式之 装饰设计模式的更多相关文章

  1. Java IO 流 -- 设计模式:装饰设计模式

    在java IO 流中我们经常看到这样的写法: ObjectOutputStream oos = new ObjectOutputStream( new BufferedOutputStream(ne ...

  2. JAVA的设计模式之装饰设计模式

    1.装饰设计模式 顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: 2.看这个图可能不容易理解,举两个 ...

  3. java_设计模式_装饰设计模式

    package IO; /* * 装饰设计模式 模拟咖啡 * 1.抽象组件:需要装饰的抽象对象(接口或抽象父类) * 2.具体组件:需要装饰的对象 * 3.抽像装饰类:包含了对抽象组件的引用以及装饰着 ...

  4. Java中IO流中的装饰设计模式(BufferReader的原理)

    本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...

  5. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

  6. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  7. 黑马程序员——JAVA基础之装饰设计模式

    ------- android培训.java培训.期待与您交流! ---------- 装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能. ...

  8. java学习之IO装饰设计模式

    装饰设计模式就是对已有的对象的功能进行增强 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装 ...

  9. Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别

    IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...

随机推荐

  1. SAP打印机配置

    SAP打印机配置 一.SAP打印原理 SAP的打印过程分两个步骤: 1.创建假脱机请求: 2.创建输出请求: 在点击打印按钮后,系统会提示创建假脱机请求后,你可以选择直接生成输出请求,或者手动生成输出 ...

  2. putty保持不掉线

    putty连接linux,一会就掉线了,然后再重新输入,比较麻烦. 参考http://www.putty.ws/putty-lianjie这篇文章解决. 如图,30表示每隔30秒putty会发一个空的 ...

  3. assign,copy,strong,weak,nonatomic的理解

    举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段 ...

  4. Android studio .9图片造成的错误总结

    前言,今天早晨遇到一个很奇葩的问题,导致我花费了很长的时间来解决.从eclipse 项目里复制过来4张.9图片,粘贴到android studio 项目里, 一运行发现报错,开始是 找不到这几张.9图 ...

  5. 代码创建storyboard

    代码创建storyboard方式如下 // 加载storyboard UIStoryboard *storyboard = [UIStoryboard StoryboardWithName:@&quo ...

  6. 【iOS】彩色TabBar切换动画实现

    无意间看到一个彩色TabBar切换的设计图,感觉很不错,有空就把他实现了. 环境信息 Mac OS X 10.10.4 Xcode 6.4 iOS 8.4 效果图: 效果图 源码下载地址: https ...

  7. Java基础知识学习(三)

    面向对象部分 首先要了解面向对象的思想,与C#一致,都是面向对象的语言 访问修饰符 public 共有的,对所有类可见. protected 受保护的,对同一包内的类和所有子类可见. private ...

  8. js中Prototype属性解释及常用方法

    1.prototype的定义 javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. 每一个构造函数都有一个属 ...

  9. 详解javascript,ES5标准中新增的几种高效Array操作方法

    1.js中常用的数组Array对象属性: 如图,其中用红色圆圈标记的部分,为ES5新增的属性. 2.浏览器支持情况: IE:9+; Chrome; Firefox2+; Safari 3+; Oper ...

  10. Mongodb Manual阅读笔记:CH8 复制集

    8 复制 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...