大话设计模式(二)

6.装饰模式

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

UML类图关系:

(1)Component对象抽象类——对象类

有一个功能fun()

(2)Decorator装饰抽象类,继承对象类(或对象抽象类)

提供一个最重要的setComponent(Component com)方法,用来设置Component;

override要被装饰的对象类方法fun(),在里面调用super.fun()

(3)装饰具体类,继承抽象装饰类

override父类方法fun(),先调用super.fun(),然后可以添加自己的功能


把每个要装饰的功能放在单独的类中,并让这个类包装它要装饰的对象,当需要执行特殊行为时,客户端代码就可以根据需要有选择地、按顺序地使用装饰功能包装对象。下面是一个装饰例子:

//抽象对象类,可以给这些对象动态添加职责
abstract class Component {
	public abstract void operation();
}

// 一个具体的对象,可以给这个对象添加职责(装饰这个对象)
class ConcreteComponent extends Component {

	@Override
	public void operation() {
		System.out.println("装饰该类");
	}
}

/**
 * 抽象装饰类,继承Component,在外面来扩展Component类的功能,即装饰它
 * 在抽象装饰类中,实现component的原功能;在继承抽象装饰类的子类中实现新添加的功能
 */
abstract class Decorator extends Component {
	private Component component;

	// 设置要装饰的类Component
	public void setComponent(Component component) {
		this.component = component;
	}

	// 执行component的功能
	@Override
	public void operation() {
		if (component != null) {
			component.operation();
		}
	}
}

// 具体的装饰对象,给component添加职责
class ConcreteDecoratorA extends Decorator {
	public void operation() {
		super.operation(); // 执行父类的方法,保持原功能
		System.out.println("A中添加新功能"); // 添加新功能
	}
}

// 具体的装饰对象,给component添加职责
class ConcreteDecoratorB extends Decorator {
	public void operation() {
		super.operation(); // 执行父类的方法,保持原功能
		System.out.println("B中添加新功能"); // 添加新功能
	}
}

public class DecoratorTest {
	public static void main(String args[]) {
		Component component = new ConcreteComponent(); // 被装饰的对象
		ConcreteDecoratorA a = new ConcreteDecoratorA(); // 装饰对象A
		ConcreteDecoratorB b = new ConcreteDecoratorB(); // 装饰对象B
		a.setComponent(component); // 用a来装饰component
		b.setComponent(a); // 用b来装饰已被a装饰的compnent
		b.operation(); // 执行b的功能,会依次向上执行父类的方法
	}
}

输出结果:

装饰该类
A中添加新功能
B中添加新功能


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值