- 浏览: 955618 次
- 性别:
- 来自: 魔都
文章分类
- 全部博客 (745)
- MultiThread (19)
- My Plan (118)
- JavaBasic (61)
- MyInterview (104)
- InternetTechnique (5)
- ProjectConclusion (1)
- Maven (5)
- MogoDb (5)
- Hadoop (11)
- Memcached (6)
- TechniqueCollect (1)
- Ibaits (1)
- Android (34)
- ItLife (40)
- Tree (2)
- ProjectArchitect (7)
- Open Source (3)
- liunx (5)
- socket (8)
- Spring (27)
- DesginPattern (35)
- WebBasic (13)
- English (13)
- structs (1)
- structs2 (2)
- Oracle (17)
- Hibernate (2)
- JavaScript (4)
- Jdbc (1)
- Jvm (15)
- Ibatis (1)
- DataStructures (13)
- Https/Socket/Tcp/Ip (3)
- Linux (4)
- Webservice (7)
- Io (2)
- Svn (1)
- Css (1)
- Ajax (1)
- ExtJs (1)
- UML (2)
- DataBase (6)
- BankTechnique (3)
- SpringMvc (3)
- Nio (3)
- Load Balancing/Cluster (3)
- Tools (1)
- javaPerformanceOptimization (8)
- Lucene(SEO) (1)
- My Think (80)
- NodeJs (1)
- Quartz (1)
- Distributed-java (1)
- MySql (7)
- Project (4)
- junit (4)
- framework (1)
- enCache (1)
- git (2)
- SCJP (1)
- sd (1)
最新评论
-
lkjxshi:
你都这水平了还考这个证干嘛
SCJP 认证考试指南 -
钟逸华:
问的真多
百度java开发面试题(转) -
zuimeitulip:
觉得我就是这样的,从小阅读量就很少,导致现在的读的速度非常慢, ...
让读书成为一种习惯 -
DDT_123456:
我觉得你是不符合要求。问你hashmap的那个问题,你那样回答 ...
阿里面试2(转) -
jingjing0907:
刚刚写了很多读过此博客的感受,竟然没有发上去,以为我注册账号还 ...
让读书成为一种习惯
JAVA装饰器模式
记得以前听一个高手说java.io包采用了了装饰器模式,当时不是很明白什么事装饰器模式,现在,网上看了一下说明和帮助的例子,他们的例子是这样的。
定义
Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。因此,装饰器模式具有如下的特征:
它必须具有一个装饰的对象。
它必须拥有与被装饰对象相同的接口。
它可以给被装饰对象添加额外的功能。
用一句话总结就是:保持接口,增强性能。
装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。
相同点:都拥有一个目标对象。
不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。
Sourcable类的源代码如程序 12-22 所示,其定义了一个接口函数 operation() 。
程序12-22 源接口 Sourcable.java
Java代码
package pattern.decorator;
public interface Sourcable {
public void operation();
}
(2 ) Source.java 是 Sourcable.java 的一个实现,其函数 operation() 负责往控制台输出一个字符串:原始类的方法。其源代码如程序 12-23 所示。
程序12-23 源类 Source.java
Java代码
package pattern.decorator;
public class Source implements Sourcable {
public void operation() {
System.out.println("原始类的方法");
}
}
(3 )装饰器类 Decorator1.java 采用了典型的对象适配器模式,它首先拥有一个 Sourcable 对象 source ,该对象通过构造函 数进行初始化。然后它实现了 Sourcable.java 接口,以期保持与 source 同样的接口,并在重写的 operation() 函数中调用 source 的 operation() 函数,在调用前后可以实现自己的输出,这就是装饰器所扩展的功能。其源代码如程序 12-24 所示。
程序12-24 装饰器类 Decorator1.java
Java代码
package pattern.decorator;
public class Decorator1 implements Sourcable {
private Sourcable sourcable;
public Decorator1(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第一个装饰器前");
sourcable.operation();
System.out.println("第一个装饰器后");
}
}
装饰器类Decorator2.java 是另一个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序 12-25 所示。
程序12-25 装饰器类 Decorator2.java
Java代码
package pattern.decorator;
public class Decorator2 implements Sourcable {
private Sourcable sourcable;
public Decorator2(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第二个装饰器前");
sourcable.operation();
System.out.println("第二个装饰器后");
}
}
装饰器类Decorator1.java 是第三个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序 12-26 所示。
程序12-26 装饰器类 Decorator3.java
Java代码
package pattern.decorator;
public class Decorator3 implements Sourcable {
private Sourcable sourcable;
public Decorator3(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第三个装饰器前");
sourcable.operation();
System.out.println("第三个装饰器后");
}
}
这时,我们就可以像使用对象的适配器模式一样来使用这些装饰器,使用不同的装饰器就可以达到不同的装饰效果。如程序12-27 所示,首先需要创建一 个源类对象 source ,然后根据将对象使用 Decorator1 来装饰,并以此使用 Decorator2 、 Decorator3 进行装饰,装饰后的对象 同样具有与 source 同样的接口。
程序12-27 测试类 DecoratorTest.java
Java代码
package pattern.decorator;
public class DecoratorTest {
/**
* @param args
*/
public static void main(String[] args) {
Sourcable source = new Source();
// 装饰类对象
Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));
obj.operation();
}
}
运行该程序的输出如下:
第1 个装饰器装饰前
第2 个装饰器装饰前
第3 个装饰器装饰前
原始类的方法
第3 个装饰器装饰后
第2 个装饰器装饰后
第1 个装饰器装饰后
从输出的结果可以看出,原始类对象source 依次被 Decorator1 、 Decorator2 、 Decorator3 进行了装饰。
记得以前听一个高手说java.io包采用了了装饰器模式,当时不是很明白什么事装饰器模式,现在,网上看了一下说明和帮助的例子,他们的例子是这样的。
定义
Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。因此,装饰器模式具有如下的特征:
它必须具有一个装饰的对象。
它必须拥有与被装饰对象相同的接口。
它可以给被装饰对象添加额外的功能。
用一句话总结就是:保持接口,增强性能。
装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。
相同点:都拥有一个目标对象。
不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。
Sourcable类的源代码如程序 12-22 所示,其定义了一个接口函数 operation() 。
程序12-22 源接口 Sourcable.java
Java代码
package pattern.decorator;
public interface Sourcable {
public void operation();
}
(2 ) Source.java 是 Sourcable.java 的一个实现,其函数 operation() 负责往控制台输出一个字符串:原始类的方法。其源代码如程序 12-23 所示。
程序12-23 源类 Source.java
Java代码
package pattern.decorator;
public class Source implements Sourcable {
public void operation() {
System.out.println("原始类的方法");
}
}
(3 )装饰器类 Decorator1.java 采用了典型的对象适配器模式,它首先拥有一个 Sourcable 对象 source ,该对象通过构造函 数进行初始化。然后它实现了 Sourcable.java 接口,以期保持与 source 同样的接口,并在重写的 operation() 函数中调用 source 的 operation() 函数,在调用前后可以实现自己的输出,这就是装饰器所扩展的功能。其源代码如程序 12-24 所示。
程序12-24 装饰器类 Decorator1.java
Java代码
package pattern.decorator;
public class Decorator1 implements Sourcable {
private Sourcable sourcable;
public Decorator1(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第一个装饰器前");
sourcable.operation();
System.out.println("第一个装饰器后");
}
}
装饰器类Decorator2.java 是另一个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序 12-25 所示。
程序12-25 装饰器类 Decorator2.java
Java代码
package pattern.decorator;
public class Decorator2 implements Sourcable {
private Sourcable sourcable;
public Decorator2(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第二个装饰器前");
sourcable.operation();
System.out.println("第二个装饰器后");
}
}
装饰器类Decorator1.java 是第三个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序 12-26 所示。
程序12-26 装饰器类 Decorator3.java
Java代码
package pattern.decorator;
public class Decorator3 implements Sourcable {
private Sourcable sourcable;
public Decorator3(Sourcable sourcable){
super();
this.sourcable=sourcable;
}
public void operation() {
System.out.println("第三个装饰器前");
sourcable.operation();
System.out.println("第三个装饰器后");
}
}
这时,我们就可以像使用对象的适配器模式一样来使用这些装饰器,使用不同的装饰器就可以达到不同的装饰效果。如程序12-27 所示,首先需要创建一 个源类对象 source ,然后根据将对象使用 Decorator1 来装饰,并以此使用 Decorator2 、 Decorator3 进行装饰,装饰后的对象 同样具有与 source 同样的接口。
程序12-27 测试类 DecoratorTest.java
Java代码
package pattern.decorator;
public class DecoratorTest {
/**
* @param args
*/
public static void main(String[] args) {
Sourcable source = new Source();
// 装饰类对象
Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));
obj.operation();
}
}
运行该程序的输出如下:
第1 个装饰器装饰前
第2 个装饰器装饰前
第3 个装饰器装饰前
原始类的方法
第3 个装饰器装饰后
第2 个装饰器装饰后
第1 个装饰器装饰后
从输出的结果可以看出,原始类对象source 依次被 Decorator1 、 Decorator2 、 Decorator3 进行了装饰。
发表评论
-
关于Java 23种设计模式的有趣见解
2013-08-10 18:01 1012关于Java 23种设计模式的有趣见解 [来源] 51CT ... -
Java中常用的设计模式(转)
2013-01-30 12:30 1113下面是我对一些常用设计模式的理解: 模式分为:行为模 ... -
工厂模式,抽象工厂模式,简单工厂的区别
2012-10-10 21:35 9511.抽象工厂模式与工厂方法模式的最大区别就在于,工 ... -
java设计模式之常用设计模式分析
2012-06-05 09:09 1274常用的设计模式有:工厂模式(工厂方法模式,简单工厂模式, ... -
java设计模式之责任链模式(行为模式 )
2012-06-04 14:31 1104(11).责任链模式: 文章链接:http:// ... -
java设计模式之观察着模式(行为模式)
2012-06-04 14:28 986(10).观察着模式Observer 文章链接:ht ... -
java设计模式之适配器模式(结构型模式)
2012-06-04 14:26 667(9).适配器模式 文章链接:http://chjl2 ... -
java设计模式之动态代理模式(结构型模式)
2012-06-04 14:24 1160(8).代理模式: 文章 ... -
java设计模式之代理模式(结构型模式)
2012-06-04 14:22 1048(8).代理模式: ... -
java设计模式之——装饰模式结(构型模式)
2012-06-03 19:34 1000三.例子代码:使用装饰 ... -
java设计模式之缺省适配器模式(构型模式)
2012-06-03 19:31 1378缺省适配器模式:文章链接:http://jzinfo.itey ... -
java设计模式之模板方法模式(行为模式 )
2012-06-03 19:03 1119package com.createtype.desginpa ... -
java设计模式之——组合模式(结构型模式 )
2012-06-03 18:24 1341接口的作用是什么?定 ... -
java设计模式之——策略模式(行为模式 )
2012-06-03 16:54 1062文章链接:http://yangguangfu ... -
java设计模式之简单工厂模式(创建型模式)
2012-06-01 00:01 1258/** * ## 具体产品(Con ... -
工厂模式,简单工厂模式,抽象工厂模式三者有什么区别
2012-05-31 23:59 1291文章链接: http://blog.csdn.net/ ... -
java设计模式之抽象工厂模式(创建型模式)
2012-05-31 23:57 1135package com.createtype.desgi ... -
java设计模式之工厂方法模式(创建型模式)
2012-05-31 23:56 949package com.createtype.desg ... -
java设计模式之单例模式(创建型模式)
2012-05-30 17:48 1059单列模式: 优点 ... -
java中设计模式分类
2012-05-01 18:31 1139常用的设计模式有:工厂模式(工厂方法模式,简单工厂模式, ...
相关推荐
在Java中,`InputStream`和其相关的装饰类(如`BufferedInputStream`、`DataInputStream`)就是很好的装饰器模式示例。`InputStream`是组件接口,`FileInputStream`等是具体组件,而`BufferedInputStream`则是一个...
ConcreteDecorator则是具体的装饰类,如“红苹果装饰器”、“绿苹果装饰器”,它们负责为小猪添加特定的能力,如加速或者跳跃。 在"shiyan5"这个压缩包中,可能包含了实现这些角色的源代码文件。例如,可能会有...
Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...
Java 装饰器设计模式 Java 装饰器设计模式是一种动态给对象添加额外职责的设计模式,通过在运行时添加新的行为,而不是在编译时继承的方式达到功能的扩充。这种模式可以使得系统更加灵活、可维护和可扩展。 首先,...
Java 实现装饰器模式(Decorator Pattern) 装饰器模式是结构型设计模式之一,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的...
1. **组件(Component)**:定义了对象的接口,也就是所有被装饰对象和装饰器对象必须共同遵循的公共行为。这个接口使得装饰者和被装饰的对象可以互换,实现了无缝对接。 2. **具体组件(Concrete Component)**:...
Java 设计模式 - 装饰器模式 装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或...
4. 具体装饰器(Concrete Decorator):是装饰器的实现,负责给具体组件添加新的职责。具体装饰器可以有多个,每个都可以添加不同的行为。 在"JAVA设计模式之装饰模式代码"的示例中,我们可能会看到以下类结构: -...
【Java设计模式之装饰器模式】装饰器模式是一种结构型设计模式,它的主要目的是在不修改已有对象的前提下,通过添加额外的职责来扩展对象的功能。这种模式遵循单一职责原则,使得扩展职责时不会破坏原有对象的结构。...
装饰器模式允许在不修改对象现有代码的情况下,动态地为对象添加职责。它通过提供一种将对象“包裹”在具有类似接口的对象中的方式来实现这一点,增强了Java设计模式的灵活性。 ## 二、详细解释及实际示例 1. **...
在Java中,装饰器模式通常涉及到接口或抽象类,以及它们的实现类。基础接口或抽象类定义了对象的核心行为,而装饰者类则实现了相同的接口或继承了相同的抽象类,以便于与原始对象无缝协作。装饰者通常持有一个对被...
4. **具体装饰者(Concrete Decorator)**:这是装饰器模式的核心,每个具体装饰者都为组件增加了一些新的行为,如加糖装饰者。 ```java public class SugarDecorator extends Decorator { public SugarDecorator...
在Java IO类库中,装饰器模式被广泛使用,以灵活地扩展类的功能,而避免了使用继承带来的复杂性。装饰器模式的核心在于,它定义了一个与组件接口相同的接口,因此可以在运行时动态地将责任附加到对象上。 在Java IO...
4. 具体装饰器(Concrete Decorator):实现抽象装饰器中的方法,可以增加新的属性或行为,或者增强原有组件的能力。 例如,假设我们有一个`Coffee`类作为具体组件,它提供了一些基本的咖啡服务,如热咖啡。然后,...
使用装饰模式时,首先创建一个基础的流对象,然后根据需求选择合适的装饰器对其进行包装。例如,如果我们需要从文件中读取数据并进行缓冲处理,可以这样操作: ```java InputStream in = new FileInputStream("file....
例如,在数据库连接池中,我们可以创建一个基础的数据库连接类,然后通过装饰器类来添加连接池管理的能力,如连接的获取、释放、池化等。 动态代理模式,另一方面,是行为型设计模式,主要用于在运行时动态创建代理...
在Java中,装饰者模式通常涉及到继承和接口的使用。装饰者模式的核心思想是,定义一个抽象组件接口(Component),然后创建一个实现了这个接口的类(ConcreteComponent)。接着,创建一个抽象装饰者接口(Decorator...
// 使用装饰器模式计算奖金 BasePrize prizeCalculator = new BasePrize("张三") { @Override public double calcPrize(Date begin, Date end) { // 基础奖金计算逻辑 return 0.0; } }; prizeCalculator = new...