`
GavinZheng
  • 浏览: 15292 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

装饰模式(Decorator Pattern)

阅读更多
装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责。就是增加功能,装饰模式相比生成子类更加灵活。



继承与装饰模式比较:继承是静态给类增加功能,而装饰者是动态给类增加功能。

优点:
a. 装饰类和被装饰类互不耦合。
b. 装饰模式是一种继承关系的替代,不管装饰多少层,最终返回的对象都是一个Component,实现的还是is-a的关系。
c. 装饰模式可以动态扩展一个实现类的功能。

缺点:
多层装饰比较复杂,减少装饰类的数量,降低系统复杂度。

使用场景:
a. 扩展一个类的功能,或者给一个类增加附加的功能。
b. 动态给一个对象增加功能,这些功能能够动态撤销。
c. 为一批兄弟类改装或者加装功能。

实现的核心:继承和聚集,即Decorator继承一个最基本,最核心,最原始的接口或者抽象类Component,同时在Decorator类中又包含一个私有的Component类。

package org.decorator;

public abstract class Component {
//	创建被装饰类
//	抽象的方法
	public abstract void operate();
}


package org.decorator;

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



package org.decorator;

public class Decorator extends Component {
	private Component component = null;
//	通过构造参数传递被装饰者
	public Decorator(Component _component) {
		// TODO Auto-generated constructor stub
		this.component = _component;
	}
//	委托被装饰者执行行
	@Override
	public void operate() {
		// TODO Auto-generated method stub
		this.component.operate();
	}

}


package org.decorator;

public class ConcreteDecorator1 extends Decorator {
//	定义被装饰者
	public ConcreteDecorator1(Component _component) {
		super(_component);
	}
//	定义自己的修饰方法
	public void method1(){
		System.out.println("method1 修饰");
	}
//	重写父类的operate方法
	@Override
	public void operate() {
		// TODO Auto-generated method stub
		this.method1();
		super.operate();
	}
	
}


package org.decorator;

public class ConcreteDecorator2 extends Decorator{
//	定义被装饰者
	public ConcreteDecorator2(Component _component) {
		super(_component);
	}
//	定义自己的修饰方法
	public void method2() {
		System.out.println("method2 修饰");
	}
//	重写父类的operate方法
	@Override
	public void operate() {
		// TODO Auto-generated method stub
		this.method2();
		super.operate();
	}

}


package org.decorator;

public class Client {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Component component = new ConcreteComponent();
		
		component = new ConcreteDecorator1(component);
		
		component = new ConcreteDecorator2(component);
		
		component.operate();
	}
}

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

相关推荐

Global site tag (gtag.js) - Google Analytics