装饰设计模式

  装饰设计模式概述

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

  优点

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

  缺点

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

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

例子:

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

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

  

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

 /**
* 这是电脑类的规则接口
*
* @author LZL
*
*/
public interface Computer {
// 电脑用来办公
public void office();
}

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

 /**
*
* 实现了电脑规则的接口
*
* @author LZL
*
*/ public class ThinkPad implements Computer { public void office() {
System.out.println("ThinkPad可以办公");
} }

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

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

 /**
* 这是对电脑进行装饰的装饰类
*
* @author LZL
*
*/
public class CPDecorate implements Computer { // 接收一个电脑类
private Computer cp; public CPDecorate(Computer cp) {
this.cp = cp;
} // 实现电脑类的方法
public void office() {
this.cp.office();
} }

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

 /**
* 这是对电脑增加编程功能的装饰类,得继承电脑的装饰类来实现
*
* @author LZL
*
*/ public class ProGramme extends CPDecorate { public ProGramme(Computer cp) {
super(cp);
} // 调用电脑的办公功能
public void office() { super.office();
System.out.println("还可以编程");
} }

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

 public class Music extends CPDecorate {

     public Music(Computer cp) {
super(cp);
} public void office() {
System.out.println("听音乐");
super.office();
}
}

  最后,我运行这台电脑:

 public class ComputerDemo {

     public static void main(String[] args) {

         // 创建电脑对象
Computer cp = new ThinkPad();
cp.office();
System.out.println("--------"); // 我要办公后来编程,那么就需要一个装饰类来实现
// 创建装饰后的电脑对象
CPDecorate cpd = new ProGramme(cp);
cpd.office();
System.out.println("------"); // 我想在办公前听音乐,再来个装饰类
cpd = new Music(cp);
cpd.office();
System.out.println("------"); // 我想在办公前听音乐,办公后编程
cpd = new Music(new ProGramme(cp));
cpd.office();
} }

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

理解下面:

比如:

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

InputStreamReader isr = new InputStreamReader(is);

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

BufferedReader br = new BufferedReader(isr);

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

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

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

 BufferedWriter bw = new BufferedWriter((newOutputStreamWriter(
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. DevExpress VCL 13.1.4支持Delphi /C++Builder XE5

    DevExpress VCL 13.1.4支持Delphi /C++Builder XE5 重大变化 ExpressLibrary dxHalfOfPi常数声明已经从cxGeometry单元移到了cx ...

  2. 【Leafletjs】1.创建一个地图

    code: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <l ...

  3. 记一次eclipse无法启动的排查过程

    起因是本地为开发工程打包,总是提示 source 1.3 不支持注释.enum等等,但询问开发开发表示自己本地打包正常. 于是排查版本问题.开发的jdk是1.6版本,自己的是1.7,于是想要不降级吧, ...

  4. jQuery代码优化:事件委托篇

    推荐阅读原文:http://www.ituring.com.cn/article/467# 推荐11收藏 随着DOM结构的复杂化和Ajax等动态脚本技术的运用,事件委托自然浮出了水面.jQuery为绑 ...

  5. 区别和详解:jQuery中的 $().each()和$.each()/jQuery.each()

    1.认识   $().each()遍历当前jQuery对象,并在每一个元素上执行回调函数.其方法内部是通过调用静态方法jQuery.each()来实现的.   jQuery.each()是一个通用的遍 ...

  6. json与jsonp的区别

    前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...

  7. 关于update set from where

    http://blog.csdn.net/xcbsdu/article/details/6736503 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值    ...

  8. arcgis 随手记

    1,ArcGISDynamicMapServiceLayer   3.0  用  4.1 以后用MapImageLayer 代码如下: <!DOCTYPE html> <html&g ...

  9. oracle学习笔记系列------oracle操作例子的专用表

    CREATE TABLE dept( deptno ), dname ) , loc ) ) ; CREATE TABLE emp( empno ), ename ), job ), mgr ), h ...

  10. iNeedle系统之国舜项目

    一.简介 本周公司接了一个小项目,是给北京国舜科技股份有限公司做一个HTTP相关的小功能产品.大概实现功能是将交换机的源数据通过解析,分析出HTTP包配对的request和response头,并把每对 ...