`

设计模式学习笔记——装饰模式

阅读更多

 

Decorator 装饰模式

又被称为包裹模式Wrap

●以对客户透明的方式动态给一个对象附加更多的责任,客户端不会感觉装饰前后对象有何不同。

●装饰模式可以在不使用创造更多子类的情狂下,将对象的功能加以扩展。

 

装饰模式的对象图是呈链状结构的

比较懒 依旧盗版过来一张类图:


 

下面是代码,来看看他们都是如何构建的:

首先是Component 他是一个抽象接口,以规范准备接受附加责任的对象

 

 

public interface Component {
	void sampleOperation();
}

 

之后是ConcreteComponent 这是具体构件角色,定义了一个将要接受附加责任的类

 

public class ConcreteComponent implements Component{
	public ConcreteComponent(){
		
	}
	public void sampleOperation(){
		System.out.println("ConcreteComponent Operation");
	}
}
 

关键的Decorator角色 他持有一个Component对象的实例,并定义一个于抽象构件接口一致的接口

 

public class Decorator implements Component{
	private Component component;
	public Decorator(Component component){
		this.component=component;
	}
	public void sampleOperation(){
		component.sampleOperation();
	}
}

最后当然是具体的装饰部分了 负责给构建添加各自的附加责任 这里只其中一个addOperate

 

public class ConcreteDecorator extends Decorator{
	public ConcreteDecorator(Component component){
		super(component);
	}
	public void sampleOperation(){
		addOperation();
		super.sampleOperation();
	}

	private void addOperation(){
		System.out.println("addOperation");
	} 
}
 

最后的结果:

 

public class DecoratorDesignPattern {
	public static void main(String[] args){
		Component component = new ConcreteComponent();
		component.sampleOperation();
		Component component2 = new ConcreteDecorator(component);
		component2.sampleOperation();
	}
}
 

输出:

ConcreteComponent Operation

addOperation

ConcreteComponent Operation

 

很明显component2仍然是Component对象 所以可以无限的嵌套。。。

 

使用装饰模式的情况:

1 需要扩展一个类的功能,或者给一个类增加附加责任

2 需要动态地给一个对象增加功能,这些功能可以再动态地撤销

3 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实

 

装饰模式的优缺点:

1 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供更多的灵活性

2 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合

3 装饰模式比继承更加容易出错

4 装饰模式相比继承产生较少的类,但同时生成更多的对象 并且这些对象看上去都比较相似

 

简化装饰模式

1 装饰类接口必须与被装饰类接口相容(ConcreteDecorator类必须继承自同一父类Component)

2 尽量保持Conponent作为一个“轻”类(可以是接口 也可以是抽象类 具体类)

3 若没有Component抽象类 只有ConcreteConponent 则Decorator类通常可以是其子类

4 若ConcreteDecorator类数目比较多,就有使用一个单独Decorator类来区分抽象和具体职责的必要,肉则可以将Decorator和ConcreteDecorator合并

 

注意,应该声明的是一个Component类型的变量(对客户端是透明的 看起来完全一样 而不是具体的ConcreteComponent)

大多数情况是半透明的装饰模式 介于装饰模式和适配器之间

 

装饰模式与其他模式的对比

装饰模式和适配器模式

装饰模式——保持端口,增强所考虑对象的性能

适配器模式——改变所考虑对象的接口,而不一定改变对象的性能

 

装饰模式和策略模式

装饰模式——表皮换掉,保持内心 要求Component尽量轻

策略模式——保持接口不变,使具体算法可以互换 抽象策略类尽量重

 

装饰模式和合成模式

装饰模式常常用于合成模式的行为扩展上,是集成的替代方案。

 

Java中的IO部分中存在大量适配器模式和装饰模式

  • 大小: 40.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics