装饰者模式——Decorator

装饰者模式—— Decorator

         有时间还是看一下《 Java 设计模式》,临近期末,为了节省时间我直接找了一些资料总结了一下。

 

1. Decorator 好处 / 目的

         A. 如果使用继承 实现功能扩展:

         我们通常使用继承来实现功能扩展,随着这些需要扩展的功能的增多,扩展功能的组合会导致更多的子类的膨胀。

         同时,使用继承实现功能的扩展,我们必须可预见这些拓展功能,这些功能编译时就确定了,是静态的。

         B. 如果使用 Decorator 实现功能扩展:

         如果扩展功能需要由用户动态决定加入的方式和时机, Decorator 提供了“即插即用”的方法,即在运行期间决定何时增加何种功能。

         这样,避免了在层次结构高层有太多的特征, Decorator 模式提供了一种“即插即用”的方法添加职责,他并不试图在一个复杂的可定制的类中支持所有可预见的特征;相反,可以定义一个简单的类,并且用 Decorator 类给他们逐渐添加功能,可以从简单的部件组合出复杂的功能。

 

         总结: The intent of Decorator is to let you compose new variations of an operation at runtime .

 

2. 如何使用 Decorator


         . Decorator 模式

 

         注意到,装饰者类 Decorator 既在①内部将被装饰者 Component 作为成员(保证请求的传递,不必实现 ConcreteComponent 已经实现的功能);又②实现了 Component 接口(保证客户端使用 Decorator 就如同使用 Component 一样)

 

         如何记忆:

         (1)记住Decorator到Component的两条线:关联——为了构造函数能传入Component;继承——为了构造函数能返回Component.

         (2)被装饰者一定要有抽象接口Component:这样才能支持装饰者模式!

 

3. Decorator 举例

         实际上, JavaI/O API 就是使用 Decorator 实现的,如果采用继承的方式,将会产生很多很多子类!

         下面仅通过一个简单的例子实现上面图中的功能。

 

客户端代码: 

package decorator;

public class Client {
	public static void main(String[] args) {
		Component component=new ConcreteComponent();
		Component decorator=new Decorator(component);
		
		component.setName("小王");
		System.out.println(component.getName());
		
		decorator.setName("小王");
		System.out.println(decorator.getName());
	}
}
 

被装饰者和被装饰者实现:

package decorator;

public interface Component {
	public void setName(String name);
	public String getName();
}

public class ConcreteComponent implements Component {
	String name;

	@Override
	public String getName() {
		return name;
	}

	@Override
	public void setName(String name) {
		this.name=name;
	}
}

 

装饰者:

package decorator;

public class Decorator implements Component {
	//如果有多个组件,可能用到private List<Component> list;
	private Component component;
	
	public Decorator(Component c){
		component=c;
	}
	
	@Override
	public String getName() {
		/*
		 * 在name前加上"名字是: "——这个效果就是装饰者达到的作用
		 */
		return "名字是: "+component.getName();
	}

	@Override
	public void setName(String name) {
		component.setName(name);
	}
}
 

输出效果:


 

参见《设计模式》板桥里人 http://www.jdon.com 2002/04/28

参见 装饰模式 (Decorator) 解析例子 ,http://tianli.blog.51cto.com/190322/35287

参见《 Java 设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值