- 浏览: 828689 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (379)
- struts (5)
- hibernate (16)
- spring (16)
- ssh (20)
- MySQL (16)
- 数据库脚本 (2)
- DownLoad (1)
- GAE (5)
- Java (103)
- LoadRunner (2)
- VF (1)
- 学习资料 (24)
- 软件使用 (21)
- 通信类 (4)
- 生活 (3)
- J2ME (1)
- 心理学 (1)
- Linux (26)
- Android (3)
- Oracle (1)
- 面向对象概念&面试准备 (11)
- ExtJs (2)
- Google Map (1)
- Flex (47)
- 算法研究 (1)
- share (20)
- python (1)
- MongoDB (7)
- centos6 (13)
- C++ (8)
- DB2 (3)
- C# (1)
- 代码片段 (24)
- Lucene (2)
- php (1)
- NodeJS (1)
- Express (1)
最新评论
-
shua1991:
已阅,我表示同意。
Eclipse统计代码行数 -
nakedou:
写的不错,挺详细的
在CentOS中使用 yum 安装MongoDB及服务器端配置 -
sjp524617477:
好方法
Eclipse统计代码行数 -
simpletrc:
<script>ale ...
Java写到.txt文件,如何实现换行 -
csdn_zuoqiang:
Apache Ftp Server,目前是1.0.4,非常好的 ...
Apache FtpServer在64位系统下服务不能启动解决方法
Decorator装饰模式是一种结构型模式,它主要是解决:“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。继承为类型引入的静态特质的意思是说以继承的方式使某一类型要获得功能是在编译时。所谓静态,是指在编译时;动态,是指在运行时。
GoF《设计模式》中说道:动态的给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活。
下面来看看Decorator模式的结构:
看这个结构好像不是很明白,下面我根据代码讲解一下这个结构。我想了一个场景:我们现在用的手机功能很多,我就用Decorator模式实现一下对某个手机的GSP和蓝牙功能扩展。 首先,我们需要一个手机的接口或者是抽象类,我这里就用抽象类来实现,代码如下:
AbstractCellPhone也就是结构图中的Component,然后,我再来实现Nokia和Moto的手机类,这类要继承AbstractCellPhone,也就是图中ConcreteComponent类要继承Component,实现代码如下:
接下来我需要一个Decorator接口或者抽象类,实现代码如下:package decorator_phone;
public abstract class AbstractCellPhone {
public abstract String CallNumber();
public abstract String SendMessage();
}
package decorator_phone;
public class NokiaPhone extends AbstractCellPhone {
public String CallNumber() {
return "NokiaPhone call sombody";
}
public String SendMessage() {
return "NokiaPhone send a message to somebody";
}
}
package decorator_phone;
public class MotoPhone extends AbstractCellPhone {
public String CallNumber() {
return "MotoPhone call sombody";
}
public String SendMessage() {
return "MotoPhone send a message to somebody";
}
}
评论
...
DecoratorGPS gpsMoto = new DecoratorGPS(phoneMoto);
...
如果你细心,会发现,上面调用类似我们读取文件时的调用:
FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
实际上Java 的I/O API就是使用Decorator实现的,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.
package decorator_phone; public abstract class Decorator extends AbstractCellPhone { private AbstractCellPhone _phone ; public Decorator(AbstractCellPhone phone) { _phone = phone ; } public String CallNumber() { return _phone.CallNumber(); } public String SendMessage() { return _phone.SendMessage(); } }
正如结构图中,这个Decorator即继承了AbstractCellPhone,又包含了一个私有的AbstractCellPhone的对象。这样做的意义是:Decorator类又使用了另外一个Component类。我们可以使用一个或多个Decorator对象来“装饰”一个Component对象,且装饰后的对象仍然是一个Component对象。在下来,我要实现GSP和蓝牙的功能扩展,它们要继承自Decorator,代码如下:
package decorator_phone; public class DecoratorGPS extends Decorator { public DecoratorGPS(AbstractCellPhone phoneGPS) { super(phoneGPS); } public String CallNumber() { return super.CallNumber() + " with GPS"; } public String SendMessage() { return super.SendMessage() + " with GPS"; } }
package decorator_phone; public class DecoratorBlueTooth extends Decorator { public DecoratorBlueTooth(AbstractCellPhone phoneGPS) { super(phoneGPS); } public String CallNumber() { return super.CallNumber() + " with BlueTooth"; } public String SendMessage() { return super.SendMessage() + " with BlueTooth"; } }
最后,用客户端程序验证一下:
package decorator_phone; public class TestPhone { public static void main(String[] args) { AbstractCellPhone phoneNokia = new NokiaPhone(); System.out.println("============== 直接继承方式 =============="); System.out.println(phoneNokia.CallNumber()); System.out.println(phoneNokia.SendMessage()); //add GSP DecoratorGPS gpsNokia = new DecoratorGPS(phoneNokia); System.out.println("============== 经 过 装 饰 =============="); System.out.println(gpsNokia.CallNumber()); System.out.println(gpsNokia.SendMessage()); //add GSP and bluetooth DecoratorBlueTooth bluetoothNokia = new DecoratorBlueTooth(gpsNokia); System.out.println(bluetoothNokia.CallNumber()); System.out.println(bluetoothNokia.SendMessage()); AbstractCellPhone phoneMoto = new MotoPhone(); System.out.println("\n============== 直接继承方式 =============="); System.out.println(phoneMoto.CallNumber()); System.out.println(phoneMoto.SendMessage()); //add GSP DecoratorGPS gpsMoto = new DecoratorGPS(phoneMoto); System.out.println("============== 经 过 装 饰 =============="); System.out.println(gpsMoto.CallNumber()); System.out.println(gpsMoto.SendMessage()); //add GSP and bluetooth DecoratorBlueTooth bluetoothMoto = new DecoratorBlueTooth(gpsMoto); System.out.println(bluetoothMoto.CallNumber()); System.out.println(bluetoothMoto.SendMessage()); } }
结果是:
============== 直接继承方式 ============== NokiaPhone call sombody NokiaPhone send a message to somebody ============== 经 过 装 饰 ============== NokiaPhone call sombody with GPS NokiaPhone send a message to somebody with GPS NokiaPhone call sombody with GPS with BlueTooth NokiaPhone send a message to somebody with GPS with BlueTooth ============== 直接继承方式 ============== MotoPhone call sombody MotoPhone send a message to somebody ============== 经 过 装 饰 ============== MotoPhone call sombody with GPS MotoPhone send a message to somebody with GPS MotoPhone call sombody with GPS with BlueTooth MotoPhone send a message to somebody with GPS with BlueTooth
发表评论
-
微信JS
2013-10-26 21:17 2034<div class="iteye-blog- ... -
ubuntu下MySQL用source命令导入sql文件出现乱码解决方法
2012-11-18 23:46 1473首先建立数据库的时候指明数据库编码如: CREA ... -
RandomAccessFile
2012-10-18 18:16 936public void run() { try { ... -
java中多种方式读文件
2012-10-18 16:53 915java中多种方式读文件一、多种方式读文件内容。1、按字节读取 ... -
FileChannelMain
2012-10-15 18:12 1064package scan; import java ... -
Apache FtpServer在64位系统下服务不能启动解决方法
2012-06-10 21:29 6780Apache FTPServer是一款用Java开发的 ... -
Java 集合类
2012-06-07 22:03 1528Java 集合类 1. 为什么要了解J ... -
short、int、long与byte之间的转换工具类
2012-05-31 11:05 4470/** * 各基础类型与byte之间的转换 * ... -
Linux Mint 13 配置JAVA 环境
2012-05-24 22:35 26140.1--下载 JAVA ... -
FatJar+Exe4j+Inno Setup 生成可执行的exe文件
2012-04-17 10:54 14171、fatjar 是Eclipse的一个免费的插件。它的 ... -
JPanel JTextField add Focus 获取焦点解决方案
2012-03-30 21:29 2974public class TabPagePanel ex ... -
JList List<E> Page 分页
2012-03-30 21:28 1722package view.retrieve.comps. ... -
JButton setAction的BUG
2012-03-23 10:53 1273今天在使用JButton的时候,想用setText()setI ... -
自定义JTabbedPane皮肤
2012-03-22 12:05 4705package ui; import java.awt. ... -
两个工具类
2012-03-17 21:27 857package com.retrieve.utils; ... -
两个工具类
2012-03-17 21:27 0package com.retrieve.utils; ... -
mysql、sqlserver、oracle分页,java分页统一接口实现
2012-03-13 17:56 0定义: pageStart 起始页,pageEnd 终止页, ... -
Invalid command: InetLoad::load
2012-03-06 16:41 1278Invalid command: InetLoad::load ... -
NIO: High Performance File Copying
2012-03-01 17:25 1142In a previous tip, I discussed ... -
自定义JList
2012-02-03 15:39 769自定义JList。
相关推荐
C#设计模式之Decorator 装饰模式,pdf+视频教学,实例演示,易学易用~~
C#面向对象设计模式 Decorator 装饰模式 视频讲座下载
C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) (Level 300)
C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式)
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第10节:结构型模式Decorator装饰模式
学习java 装饰模式(decorator)非常好的例子
NULL 博文链接:https://janeky.iteye.com/blog/472502
装饰器(Decorator)模式 详细教程,简明易懂,非常清晰的,附带有代码示例。
设计模式C++学习之装饰模式(Decorator)
动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活。
Head First学习笔记+Head First之装饰者模式高清PDF
C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) C#面向对象设计模式纵横谈(11):Facade 外观模式(结构型模式) C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) C#面向对象设计...
3.4 DECORATOR 装饰模式 43 3.5 FACADE 外观模式 46 3.6 FLYWEIGHT 享元模式 49 3.7 PROXY 代理模式 53 行为模式 57 4.1 CHAIN OF RESPONSIBILITY 职责链模式 57 4.2 COMMAND 命令模式 61 4.3 INTERPRETER 解释器...
装饰模式.doc 装饰模式.doc 装饰模式.doc
com.javapatterns.decorator 装饰模式 com.javapatterns.dip 依赖倒转原则 com.javapatterns.doubledispatch 专题:单分派与多分派 com.javapatterns.facade 门面模式 com.javapatterns.factorymethod 工厂方法...
5、装饰模式(Decorator) 用意:动态地给一个对象增加其它职责,比继承实现灵活。
“就增加功能来说,Decorator 模式相比生成子类更为灵活” 这句话的含义是,组合比继承更灵活,当可拓展的功能很多时,继承方案会产生大量的子类,而组合可以提
NULL 博文链接:https://xiangtui.iteye.com/blog/1033790