结构型--装饰器

概念


在不改变原类文件和也不使用继承的情况下,动态地扩展一个类的功能。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,为用户提供额外的功能。

优点:

  1. 装饰类和被装饰类可以独立发展,不会相互耦合。
  2. 装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:

  1. 多层装饰比较复杂。

 

用例


public class ClientOne {
	public static void main(String[] args) {
		Sourceable source = new Source();
		System.out.println("before decorator");
		source.method();
		System.out.println("after decorator");
		Sourceable decorator = new Decorator(source);
		decorator.method();
	}
}
interface Sourceable  {
	void method();
}
//被装饰类
class Source implements Sourceable  {
	@Override
	public void method() {
		System.out.println("Original method()");
	}
}
//装饰类
class Decorator implements Sourceable {
	private Sourceable source;
	public Decorator(Sourceable source){
		this.source = source;
	}
	@Override
	public void method(){
		source.method();
		addBehavior();
	}  
	public void addBehavior() {
		System.out.println("Extend addBehavior()");
	}
}

Output:
before decorator
Original method()
after decorator
Original method()
Extend addBehavior()

或者:将装饰器类Decorator设置为abstract类型,然后创建抽象装饰器的实现类。

public class ClientOne {
	public static void main(String[] args) {
		Component component = new ConcreteComponent();
		System.out.println("before decorator");
		component.operation();
		System.out.println("after decorator");
		Component decorator = new ConcreteDecoratorA(component);
		decorator.operation();
	}
}

//  Component: 抽象构件
interface Component  {
	void operation();
}

//  ConcreteComponent: 具体构件,被装饰类
class ConcreteComponent implements Component  {
	@Override
	public void operation() {
		System.out.println("Original method()");
	}
}

//  Decorator: 抽象装饰类
abstract class Decorator implements Component {
	protected Component component;
	public Decorator(Component component){
		this.component = component;
	}
	@Override
	public void operation(){
		component.operation();
	}  
}

//  ConcreteDecorator: 具体装饰类
class ConcreteDecoratorA extends Decorator {
	public ConcreteDecoratorA(Component component) {
	    super(component);     
	}
	@Override
	public void operation(){
		component.operation();
		addBehavior();
	}  
	public void addBehavior() {
		System.out.println("Extend addBehavior()");
	}
}

Output:
before decorator
Original method()
after decorator
Original method()
Extend addBehavior()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值