您的位置:首页 > 其它

设计模式(9)-结构型-装饰模式(Decorator)

2012-11-20 20:07 573 查看

概述

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。可以简称为"修修补补"

适用性

1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤消的职责。
3.当不能采用生成子类的方法进行扩充时。

参与者

1.Component 定义一个对象接口,可以给这些对象动态地添加职责。

2.ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。

3.Decorator 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。

4.ConcreteDecorator 向组件添加职责。
其基本类图如下图所示:



示例:

package com.sql9.structured;

abstract class Component {
	public abstract void draw();
}

class ConcreteComponent extends Component {
	
	private String name;
	
	public ConcreteComponent(String name) {
		this.name = name;
	}

	@Override
	public void draw() {
		System.out.println(String.format("ConcreteComponent - %s", name));
	}
	
}

abstract class Decorator extends Component {
	protected Component internalComponent;
	
	public void setComponent(Component c) {
		this.internalComponent = c;
	}
	
	@Override
	public void draw() {
		if (internalComponent != null) {
			internalComponent.draw();
		}
	}
}

class ConcreteDecorator extends Decorator {
	
	private String customName;
	
	public ConcreteDecorator(String name) {
		this.customName = name;
	}
	
	@Override
	public void draw() {
		extraDraw();
		super.draw();
	}
	
	protected void extraDraw() {
		System.out.println("Draw extra action in ConcreteDecorator...");
	}
}

public class DecoratorTest {

	public static void main(String[] args) {
		ConcreteComponent c = new ConcreteComponent("This is the real component");
		ConcreteDecorator d = new ConcreteDecorator("This is a decorator for the component");
		d.setComponent(c);
		d.draw();
	}
}

结果:

Draw extra action in ConcreteDecorator...
ConcreteComponent - This is the real component
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: