java 28 - 3 设计模式之 装饰设计模式
装饰设计模式
装饰设计模式概述
装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案
优点
使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能
缺点
正因为可以随意组合,所以就可能出现一些不合理的逻辑
装饰设计模式,就是继承的替代方案。
例子:
手机的例子:(装饰设计模式)

现在用个电脑类来写代码例子:
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 设计模式之 装饰设计模式的更多相关文章
- Java IO 流 -- 设计模式:装饰设计模式
在java IO 流中我们经常看到这样的写法: ObjectOutputStream oos = new ObjectOutputStream( new BufferedOutputStream(ne ...
- JAVA的设计模式之装饰设计模式
1.装饰设计模式 顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: 2.看这个图可能不容易理解,举两个 ...
- java_设计模式_装饰设计模式
package IO; /* * 装饰设计模式 模拟咖啡 * 1.抽象组件:需要装饰的抽象对象(接口或抽象父类) * 2.具体组件:需要装饰的对象 * 3.抽像装饰类:包含了对抽象组件的引用以及装饰着 ...
- Java中IO流中的装饰设计模式(BufferReader的原理)
本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- 黑马程序员——JAVA基础之装饰设计模式
------- android培训.java培训.期待与您交流! ---------- 装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能. ...
- java学习之IO装饰设计模式
装饰设计模式就是对已有的对象的功能进行增强 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装 ...
- Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别
IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...
随机推荐
- ABAP 动态生成内表的几种方法
最近要写个程序,既有更新的,也有删除的,需要涉及到很多系统表,如果一个表一个表进行更新或者删除太慢了,于是就想通过创建动态内表来实现这些功能,在网上找了一些资料,经过多次尝试,终于测试成功了.网上讲述 ...
- 使用MDK3探测隐藏SSID名称
先将网卡设置为监听模式. airmon-ng start wlan0 扫描附近无线网络,找出隐藏SSID的AP. airodump-ng wlan0mon 这里用下图搜到的第一个隐藏SSID做测试. ...
- SharePoint 2010 网站备份还原简单介绍
今天尝试了SharePoint2010网站的备份和还原,从网上搜一些文档看看,然后自己试试,感觉和2007的操作没什么太大的区别,跟大家分享下自己尝试的命令行方式和数据库的方式,2007自己常用的也是 ...
- Kotlin:Android世界的Swift
转自:http://www.infoq.com/cn/news/2015/06/Android-JVM-JetBrains-Kotlin Kotlin是一门与Swift类似的静态类型JVM语言,由Je ...
- android studio 使用SVN 锁定文件,防止别人修改(基于Android studio 1.4 )
首先假设开发 A , 和 开发 B , 在使用 SVN 进行项目管理.那么A如何才能 某个锁定文件,防止B修改. 1.第一步,给这个文件加锁 完成这一步,则这个文件就别锁定了. 2.第二步,假如 ...
- 把应用push到/system/app上面后,出现java.lang.UnsatisfiedLinkError的问题
把应用push到/system/app下面后,加载.so库的问题 01-01 00:07:08.186: E/MessageQueue-JNI(2683): java.lang.Unsatisfied ...
- UIApplication是什么
1.UIApplication对象是应用程序的象征 2.每一个应用都有自己的UIApplication对象,而且是单例的(只有一个) 3.通过[UIApplication sharedAppl ...
- jQuery和ExtJS的timeOut超时问题和event事件处理问题
对jQuery来说,超时可以直接设置timeout参数,并在error事件中捕获第二个参数,如果是“timeout”则表明捕获了超时事件,非常清楚. 例子: $.ajax({ type ...
- 每日Scrum(5)
进入冲刺第五天,软件的界面设计成为主打,收集学校的很多美图是我们组的任务: 问题在于软件已很难有很大的改进,大方向也都是变不了的
- .Net开源网络爬虫Abot介绍
.Net中也有很多很多开源的爬虫工具,abot就是其中之一.Abot是一个开源的.net爬虫,速度快,易于使用和扩展.项目的地址是https://code.google.com/p/abot/ 对于爬 ...