- 浏览: 850521 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (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 2115<div class="iteye-blog- ... -
ubuntu下MySQL用source命令导入sql文件出现乱码解决方法
2012-11-18 23:46 1617首先建立数据库的时候指明数据库编码如: CREA ... -
RandomAccessFile
2012-10-18 18:16 1002public void run() { try { ... -
java中多种方式读文件
2012-10-18 16:53 1004java中多种方式读文件一、多种方式读文件内容。1、按字节读取 ... -
FileChannelMain
2012-10-15 18:12 1126package scan; import java ... -
Apache FtpServer在64位系统下服务不能启动解决方法
2012-06-10 21:29 6952Apache FTPServer是一款用Java开发的 ... -
Java 集合类
2012-06-07 22:03 1902Java 集合类 1. 为什么要了解J ... -
short、int、long与byte之间的转换工具类
2012-05-31 11:05 4547/** * 各基础类型与byte之间的转换 * ... -
Linux Mint 13 配置JAVA 环境
2012-05-24 22:35 26750.1--下载 JAVA ... -
FatJar+Exe4j+Inno Setup 生成可执行的exe文件
2012-04-17 10:54 14781、fatjar 是Eclipse的一个免费的插件。它的 ... -
JPanel JTextField add Focus 获取焦点解决方案
2012-03-30 21:29 3042public class TabPagePanel ex ... -
JList List<E> Page 分页
2012-03-30 21:28 1775package view.retrieve.comps. ... -
JButton setAction的BUG
2012-03-23 10:53 1321今天在使用JButton的时候,想用setText()setI ... -
自定义JTabbedPane皮肤
2012-03-22 12:05 4757package ui; import java.awt. ... -
两个工具类
2012-03-17 21:27 908package 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 1407Invalid command: InetLoad::load ... -
NIO: High Performance File Copying
2012-03-01 17:25 1221In a previous tip, I discussed ... -
自定义JList
2012-02-03 15:39 821自定义JList。
相关推荐
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...
C#面向对象设计模式 Decorator 装饰模式 视频讲座下载
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第10节:结构型模式Decorator装饰模式
Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客()将深入探讨这个模式的细节。 装饰模式的核心...
装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或增强现有功能,而无需改变该对象的类。在C#中,装饰模式通常通过继承和组合来实现,它提供了一种灵活的方式来动态地改变对象的行为。在这个“C#...
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
装饰器(Decorator)模式 装饰器(Decorator)模式是一种典型的结构型模式,主要用意是动态地为对象添加一些额外的功能。它提供了一个灵活的替代方案来继承子类,以扩展对象的功能。 在《Element of Reusable ...
在装饰者模式中,我们通常有两个主要的角色:Component(组件)和Decorator(装饰器)。Component是被装饰的对象接口,定义了所有装饰器和原始对象共同拥有的行为。Concrete Component是Component的具体实现,是实际...
装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...
装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...
装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...
【Decorator模式】是一种设计模式,它允许在运行时动态地给对象...在实际的软件开发中,Decorator模式同样适用于那些需要动态增减功能的对象,例如在UI设计中添加装饰元素,或者在数据库连接池中添加不同的连接策略等。
装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...
装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...
装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...