设计模式之装饰模式

以对客户端透明的方式(包装器和被包装的类实现统一接口)、通过排列组合的方式 为已有对象添加新的功能或增强又有功能。

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		// 透明,面向抽象编程  c-->ConcreteDecorator1-->ConcreteDecorator2
		Component c = new ConcreteComponent();
		Component wrapper1 = new ConcreteDecorator1(c);
		Component wrapper2 = new ConcreteDecorator2(wrapper1);
		System.out.println(wrapper2.fun("xxxxx"));
		
		// 或者任意组合 c-->ConcreteDecorator2-->ConcreteDecorator1
		Component wrapper11 = new ConcreteDecorator2(c);
		Component wrapper22 = new ConcreteDecorator1(wrapper11);
		System.out.println(wrapper22.fun("yyyyy"));
		
		// 半透明,面向具体编程
		ConcreteDecorator1 wrapper111 = new ConcreteDecorator1(c);
		ConcreteDecorator2 wrapper222 = new ConcreteDecorator2(wrapper111);
		System.out.println(wrapper222.fun("zzzzz"));
	}
}

interface Component {
	String fun(String str);
}
// 具体构件类
// 如果只有一个具体构件类,则下面的抽象包装器可以直接继承自该具体构件类
class ConcreteComponent implements Component {
	public String fun(String str) {
		return "原始数据: '" + str + "'";
	}
}

abstract class AbstractDecorator implements Component {
	protected Component c;
	public AbstractDecorator(Component c) {
		this.c = c;
	}
	
	public abstract String fun(String str) ;
}

class ConcreteDecorator1 extends AbstractDecorator {
	
	public ConcreteDecorator1 (Component c) {
		super(c);
	}
	
	public String fun(String str) {
		return "ConcreteDecorator1 包装了:[ " + c.fun(str) + "]";
	}
}

class ConcreteDecorator2 extends AbstractDecorator {
	
	public ConcreteDecorator2 (Component c) {
		super(c);
	}
	
	public String fun(String str) {
		return "ConcreteDecorator2 包装了:[ " + c.fun(str) + "]";
	}
}


运行结果:

ConcreteDecorator2 包装了:[ ConcreteDecorator1 包装了:[ 原始数据: 'xxxxx']]
ConcreteDecorator1 包装了:[ ConcreteDecorator2 包装了:[ 原始数据: 'yyyyy']]
ConcreteDecorator2 包装了:[ ConcreteDecorator1 包装了:[ 原始数据: 'zzzzz']]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值