您的位置:首页 > 其它

设计模式之11装饰模式(笔记)

2012-05-16 23:25 393 查看
1 定义:

1.1 定义:(Decorator Pattern)Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible
alternative to subclassing for extending functionality.(保持接口不变的情况下,动态地给一个对象添加一些额外的职责。就增加功能来讲,装饰模式相比生成子类更为灵活。)

1.2 通用类图:



要变为更可理解的类图



1.3 通用代码:

角色说明:

Component抽象构件(必须的)

Component是一个接口或者是抽象类,定义我们最核心的对象,也就是最原始的对象。

ConcreteComponent具体构件

ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,它是要被装饰的目标。

Decorator装饰角色

Decorator一般是一个抽象类,用来实现接口或者抽象方法,这里面不一定有抽象的方法,但在它的属性里必然有一个private变量指向Component抽象的构件。

ConcreteDecoratorA

ConcreteDecoratorA是具体的装饰类,也就是要附加到ConcreteComponent的事物实现。

一句话:通过具体装饰来为具体构件添砖加料。

public abstract class Component {
		// 抽象的方法
		public abstract void operate();
	}

	public class ConcreteComponent extends Component {
		// 具体实现
		@Override
		public void operate() {
			System.out.println("do Something");
		}
	}

	public abstract class Decorator extends Component {
		private Component component = null;

		// 通过构造函数传递被修饰者
		public Decorator(Component _component) {
			this.component = _component;
		}

		// 委托给被修饰者执行
		@Override
		public void operate() {
			this.component.operate();
		}
	}

	public class ConcreteDecorator1 extends Decorator {
		// 定义被修饰者
		public ConcreteDecorator1(Component _component) {
			super(_component);
		}

		// 定义自己的修饰方法
		private void method1() {
			System.out.println("method1 修饰");
		}

		// 重写父类的Operation方法
		public void operate() {
			this.method1();
			super.operate();
		}
	}

	public class ConcreteDecorator2 extends Decorator {
		// 定义被修饰者
		public ConcreteDecorator2(Component _component) {
			super(_component);
		}

		// 定义自己的修饰方法
		private void method2() {
			System.out.println("method2修饰");
		}

		// 重写父类的Operation方法
		public void operate() {
			super.operate();
			this.method2();
		}
	}

	public class Client {
		public static void main(String[] args) {
			Component component = new ConcreteComponent();
			// 第一次修饰
			component = new ConcreteDecorator1(component);
			// 第二次修饰
			component = new ConcreteDecorator2(component);
			// 修饰后运行
			component.operate();
		}
	}


2 优点

2.1 装饰类与被装饰类可以独立发展,而不会相互耦合。

2.2 装饰模式是继承关系的一个替代方案。查看Decorator类,不管装饰多少层,返回的对象还是Component,实现的还是is-a的关系。

2.3 装饰模式可以动态地扩展一个实现类的功能,其定义如此。

3 缺点

尽量减少装饰叠加类的数量,叠加次数越多,系统的复度越高。

4 应用场景

继承是静态的给类增加功能,而装饰是动态的增加功能;

当业务变更,冒出新需求时,尤其是一个较大的需求时,可以考虑它。

4.1 需要扩展一个类的功能,或给一个类增加额外的功能;

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

4.3 需要为一批兄弟类进行改装或加装功能,首选装饰模式。

5 注意事项



6 扩展



7 范例

实例如通用源代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: