Decorator Pattern,又叫装饰模式。
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰模式的特点:
(1)装饰对象和真实对象有相同的接口。客户端可以用与真实对象相同的方式和装饰对象交互。
(2)装饰对象包含一个真实对象的引用(reference)。
(3)装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。
(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
例子:
一个房子要装修,可以分步骤装修,主厅,客厅,厨房,浴室,休息室...如果使用传统的继承,则会产生想当多的子类父类之间的继承,代码的维护管理比较难。
使用装饰模式则可以这样:装饰对象引用一个真实对象,并在装饰之前调用真实对象的方法,从而达到动态的增加修饰的作用;如下图
就像层层递归一样,在装饰之前完成原有真实对象的描述。
代码如下:
package test.patterns.decorator;
interface House{
public abstract void decorate();
}
class ConcreteHouse implements House{
@Override
public void decorate() {
System.out.println("准备装修房子...");
}
}
class Decorator implements House{
public House house;
public Decorator() {}
public Decorator(House house) {
this.house=house;
}
@Override
public void decorate() {
house.decorate();
}
}
class DecoratorKitchen extends Decorator{
public DecoratorKitchen() {}
public DecoratorKitchen(House house) {
this.house=house;
}
@Override
public void decorate() {
super.decorate();
System.out.println("装饰厨房...");
}
}
class DecoratorRestRoom extends Decorator{
public DecoratorRestRoom() {}
public DecoratorRestRoom(House house) {
this.house=house;
}
@Override
public void decorate() {
super.decorate();
System.out.println("装饰休息室...");
}
}
class DecoratorMainRoom extends Decorator{
public DecoratorMainRoom() {}
public DecoratorMainRoom(House house) {
this.house=house;
}
@Override
public void decorate() {
super.decorate();
System.out.println("装饰主厅...");
}
}
public class TestDecorator{
public static void main(String[] args) {
House concreteHouse = new ConcreteHouse();
House decorator = new Decorator(concreteHouse);
House decoratorMain = new DecoratorMainRoom(decorator);
House decoratorKitchen = new DecoratorKitchen(decoratorMain);
House decoratorRestRooom = new DecoratorRestRoom(decoratorKitchen);
decoratorRestRooom.decorate();
}
}
如果想调整顺序的话,传统方式将更改大量的代码,而装饰模式只需要调整实现的顺序即可。
代理模式,装饰模式,适配器模式之间的区别:
1、代理模式更多的是过程的控制功能;
2、装饰者模式主要是给被装饰者增加新职责的;
3、适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。
Have a nice Day~
- 大小: 32.2 KB
- 大小: 38.2 KB
分享到:
相关推荐
设计模式 - 装饰模式(C++实例) 若有问题,请指出。
设计模式--装饰者模式java例子
设计模式--装饰模式 设计模式--装饰模式 设计模式--装饰模式 设计模式--装饰模式
23种设计模式--装饰模式
JAVA-设计模式-结构型模式-装饰模式
c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
设计模式-装饰模式(讲解及其实现代码)
设计模式 - 装饰者模式
2.开发一个系统帮助业务部门实现灵活的奖金计算。对于普通员工,主要有个人当月业务奖金、个人当月回款奖金等,对于部门经理,除了有普通员工的奖金外,还有...请写出你所选择的设计模式,画出类图,并给出核心代码。
java常用设计模式-装饰器模式
设计模式专题之(七)装饰模式---设计模式装饰模式示例代码(python--c++)
设计模式—装饰者模式,介绍的非常详细,讲解透彻
cpp代码-设计模式-装饰模式
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》
ios平台中通过最简单的代码讲解装饰器模式,可在博客http://blog.sina.com.cn/s/blog_161d504630102wxis.html中查看简单解释
使用PHP实现的设计模式之装饰者模式,希望对您的开发有所启发。
装饰者模式:动态地将责任附加到对象上,若要扩展对象,装饰者模式提供了比继承更弹性的替代方案