- 浏览: 33445 次
- 性别:
- 来自: 上海
最新评论
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
适用性
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤消的职责。
3.当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支 持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类
定义被隐藏,或类定义不能用于生成子类。
来分析下 JUnit 的使用是属于哪种情况。首先实现了比静态继承更加灵活的方式,动态
的增加功能。试想为Test 的所有实现类通过继承来增加一个功能,意味着要添加不少的功
能类似的子类,这明显是不太合适的。
而且,这就避免了高层的类具有太多的特征,比如上面提到的带有警报的抽象门类。
透明和半透明
对于面向接口编程,应该尽量使客户程序不知道具体的类型,而应该对一个接口操作。
这样就要求装饰角色和具体装饰角色要满足Liskov 替换原则。像下面这样:
Component c = new ConcreteComponent();
Component c1 = new ConcreteDecorator(c);
JUnit 中就属于这种应用,这种方式被称为透明式。而在实际应用中,比如java.io 中往
往因为要对原有接口做太多的扩展而需要公开新的方法(这也是为了重用)。所以往往不能
对客户程序隐瞒具体的类型。这种方式称为“半透明式”。
在 java.io 中,并不是纯装饰模式的范例,它是装饰模式、适配器模式的混合使用。
其它
采用 Decorator 模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅
在他们相互连接的方式上有所不同,而不是它们的类或是它们的属性值有所不同。尽管对于
那些了解这些系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困
难。这是GOF 提到的装饰模式的缺点,你能体会吗?他们所说的小对象我认为是指的具体
装饰角色。这是为一个对象动态添加功能所带来的副作用
参与者
1.Component
定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent
定义一个对象,可以给这个对象添加一些职责。
3.Decorator
维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
4.ConcreteDecorator
向组件添加职责。
类图
例子
Component定义一个对象接口,可以给这些对象动态地添加职责。
public interface Person {
void eat();
}
ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。
public class Man implements Person {
public void eat() {
System.out.println("男人在吃");
}
}
Decorator 维持一个执行Component对象的指针,并定义一个与Componect 接口一致的接口。
public abstract class Decorator implements Person {
protected Person person;
public void setPerson(Person person) {
this.person = person;
}
public void eat() {
person.eat();
}
}
ConcreteDectrator 想组建添加职责
public class ManDecoratorA extends Decorator {
public void eat() {
super.eat();
reEat();
System.out.println("ManDecoratorA类");
}
public void reEat() {
System.out.println("再吃一顿饭");
}
}
public class ManDecoratorB extends Decorator {
public void eat() {
super.eat();
System.out.println("===============");
System.out.println("ManDecoratorB类");
}
}
Test
public class Test {
public static void main(String[] args) {
Man man = new Man();
ManDecoratorA md1 = new ManDecoratorA();
ManDecoratorB md2 = new ManDecoratorB();
md1.setPerson(man);
md2.setPerson(md1);
md2.eat();
}
}
result
男人在吃
再吃一顿饭
ManDecoratorA类
===============
ManDecoratorB类
适用性
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤消的职责。
3.当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支 持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类
定义被隐藏,或类定义不能用于生成子类。
来分析下 JUnit 的使用是属于哪种情况。首先实现了比静态继承更加灵活的方式,动态
的增加功能。试想为Test 的所有实现类通过继承来增加一个功能,意味着要添加不少的功
能类似的子类,这明显是不太合适的。
而且,这就避免了高层的类具有太多的特征,比如上面提到的带有警报的抽象门类。
透明和半透明
对于面向接口编程,应该尽量使客户程序不知道具体的类型,而应该对一个接口操作。
这样就要求装饰角色和具体装饰角色要满足Liskov 替换原则。像下面这样:
Component c = new ConcreteComponent();
Component c1 = new ConcreteDecorator(c);
JUnit 中就属于这种应用,这种方式被称为透明式。而在实际应用中,比如java.io 中往
往因为要对原有接口做太多的扩展而需要公开新的方法(这也是为了重用)。所以往往不能
对客户程序隐瞒具体的类型。这种方式称为“半透明式”。
在 java.io 中,并不是纯装饰模式的范例,它是装饰模式、适配器模式的混合使用。
其它
采用 Decorator 模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅
在他们相互连接的方式上有所不同,而不是它们的类或是它们的属性值有所不同。尽管对于
那些了解这些系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困
难。这是GOF 提到的装饰模式的缺点,你能体会吗?他们所说的小对象我认为是指的具体
装饰角色。这是为一个对象动态添加功能所带来的副作用
参与者
1.Component
定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent
定义一个对象,可以给这个对象添加一些职责。
3.Decorator
维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
4.ConcreteDecorator
向组件添加职责。
类图
例子
Component定义一个对象接口,可以给这些对象动态地添加职责。
public interface Person {
void eat();
}
ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。
public class Man implements Person {
public void eat() {
System.out.println("男人在吃");
}
}
Decorator 维持一个执行Component对象的指针,并定义一个与Componect 接口一致的接口。
public abstract class Decorator implements Person {
protected Person person;
public void setPerson(Person person) {
this.person = person;
}
public void eat() {
person.eat();
}
}
ConcreteDectrator 想组建添加职责
public class ManDecoratorA extends Decorator {
public void eat() {
super.eat();
reEat();
System.out.println("ManDecoratorA类");
}
public void reEat() {
System.out.println("再吃一顿饭");
}
}
public class ManDecoratorB extends Decorator {
public void eat() {
super.eat();
System.out.println("===============");
System.out.println("ManDecoratorB类");
}
}
Test
public class Test {
public static void main(String[] args) {
Man man = new Man();
ManDecoratorA md1 = new ManDecoratorA();
ManDecoratorB md2 = new ManDecoratorB();
md1.setPerson(man);
md2.setPerson(md1);
md2.eat();
}
}
result
男人在吃
再吃一顿饭
ManDecoratorA类
===============
ManDecoratorB类
发表评论
-
模板方法模式
2013-06-27 10:28 399引用http://eneasy.iteye.com/blog/ ... -
状态模式
2013-06-26 16:38 519引用http://blog.csdn.net/hguisu/a ... -
策略模式
2013-06-24 18:28 539定义 策略模式(Strategy)属于对象行为型设计模式,主要 ... -
代理模式-动态代理
2013-06-20 16:37 474转自:http://www.cnblogs.com/jqyp/ ... -
观察者模式-JDK支持
2013-06-18 14:39 387JDK对观察者模式的支持主要是通过Observable类和Ob ... -
观察者模式
2013-06-18 13:31 348GoF说道:Observer模式的意图是“定义对象间的一种一对 ... -
备忘录模式
2013-06-14 15:45 361转载:http://blog.csdn.net/m136663 ... -
java 中介者模式
2013-06-07 16:19 570定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需 ... -
迭代器模式
2013-06-07 11:18 626定义:提供一种方法访 ... -
命令模式
2013-06-05 16:56 730定义 将一个请求封装为 ... -
责任链模式
2013-06-03 16:46 532转自:《深入浅出设计 ... -
代理模式
2013-05-27 11:07 409一、简介 代理模式有两 ... -
享元模式
2013-05-23 16:43 502一、引子 让我们先来复习下 java 中String 类型的特 ... -
门面模式
2013-05-21 15:28 402转自http://www.cnblogs.com/java-m ... -
组合模式
2013-05-20 16:21 678一、引子 在大学的数据 ... -
桥接模式
2013-05-10 11:05 577认识桥接模式 (1)什么是桥接 在桥接模式里面 ... -
适配器模式
2013-05-08 14:04 6021. 概述 将一个类的接口转换成客户希望的另外一个接口 ... -
原型模式
2013-04-22 14:53 612转自:http://blog.csdn.net/zhengzh ... -
单态模式
2013-04-22 14:24 573保证一个类仅有一个实例,*提供一个访问它的全局访*点。 适 ... -
建造者模式
2013-04-18 10:27 615转自:http://www.2cto.com/kf/20120 ...
相关推荐
装饰模式是Erich Gamma等人所著的《设计模式:可利用面向对象软件的基础》一书中众多模式之一。一般来说,此模式在设计Swing的程序员中比较流行,他们用它来改进软件。今天,即使有许多程序是基于Web应用的,装饰...
java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式java设计模式之装饰模式
设计模式 c# 装饰模式
装饰模式.doc 装饰模式.doc 装饰模式.doc
C++23种设计模式之 装饰模式。:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需 要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功 能),就会增加类的...
装饰模式的一个简单实例,小猪吃苹果的游戏,每吃一种苹果,增加一种不同的功能。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。
JAVA设计模式之装饰模式代码
装饰模式: 装饰模式是为已有功能动态的添加更多功能的一种方法。 如果需要为一个主类里添加新的字段,新的方法和新的逻辑,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为, 那么就...
设计模式 - 装饰模式(C++实例) 若有问题,请指出。
软件设计模式之装饰模式讲解ppt,可用于教学课件。
设计模式C++学习之装饰模式(Decorator)
装饰模式的示例代码和文档,学习装饰模式的参考资料。
根据售卖咖啡的过程,客户先选择一种口味的咖啡,又选择不同种类的配料,由于配料选择是不定的,符合装饰模式的应用情况。
23种设计模式--装饰模式
装饰模式简单例子,根据《Head First设计模式》第3章中的咖啡店的例子编写
Java的装饰模式的实例代码,生成密码的实例
实验九:装饰模式.rar实验九:装饰模式.rar中有小猪游戏,肖像画加装饰物以及咖啡茶的装饰
通过设计组装和升级大众CC来说明装饰模式,有一个VolkCC类实现Volk接口,设计一个CCDecorator实现Volk这个接口,在ConcreteCCDecorator这个具体装饰角色中进行功能的增加和重写。
装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
C#设计模式之Decorator 装饰模式,pdf+视频教学,实例演示,易学易用~~