[设计模式]装饰模式

装饰模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一,在现实生活中你也可以看见很多装饰模式的例子,比如人需要各式各样的衣着,不管穿什么样的衣服,对于人这个本质是不变的,这就是装饰模式

定义

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。

使用场景

需要透明且动态地扩展类的功能时。

UML类图

 

Component : 抽象组件,可以是一个接口或抽象类,其充当的就是被装饰的原始的对象。

ConcreteComponent : 组件具体实现类,该类是Component类的基本实现,也是我们装饰的具体对象。

Decorator:抽象装饰者,其承担的职责就是为了装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。在大多数情况下,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类。当然,如果装饰逻辑单一,只有一个的情况下我们可以省略该类直接作为具体的装饰者。

ConcreteDecorattorA/B:装饰者具体实现类,只是对抽象装饰者作出具体的实现。

示例

/**
 * 抽象组件类
 * @author Administrator
 *
 */
public abstract class Component {
	/**
	 * 抽象的方法,同样你也可以增加更多的抽象方法
	 */
	public abstract void operate();
}
/**
 * 组件具体实现类
 * @author Administrator
 *
 */
public class ConcreteComponent extends Component {

	@Override
	public void operate() {
		System.out.println("ConcreteComponent operate");
	}

}
public abstract class Decorator extends Component{
	private Component component; //持有一个Component对象的引用
	
	public Decorator(Component component) {
		this.component = component;
	}
	
	@Override
	public void operate() {
		component.operate();
	}
}
/**
 * 装饰者具体实现类
 * @author Administrator
 *
 */
public class ConcreteDecoratorA extends Decorator{

	public ConcreteDecoratorA(Component component) {
		super(component);
	}
	
	@Override
	public void operate() {
		//装饰方法AB既可在父类方法前调用也可在之后调用
		operateA();
		super.operate();
		operateB();
	}

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

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

}

ConcreteDecoratorB与A一样就不一一添加了

public class Client {
	public static void main(String[] args) {
		//构建被装饰的组件对象
		Component component = new ConcreteComponent();
		
		//根据组件对象构建装饰者对旬日有A并调用,此时相当于给组件对象增加装饰者A的功能方法
		Decorator decorator = new ConcreteDecoratorA(component);
		decorator.operate();
		
		//根据组件对象构建装饰者对旬日有A并调用,此时相当于给组件对象增加装饰者A的功能方法
		Decorator decoratorB = new ConcreteDecoratorB(component);
		decoratorB.operate();
	}
}
运行结果:
ConcreteDecoratorA operateA
ConcreteComponent operate
ConcreteDecoratorA operateB
ConcreteDecoratorB operateA
ConcreteComponent operate
ConcreteDecoratorB operateB


总结

装饰模式和代理模式有点类似,有时甚至容易混淆,倒不是说会把代理当成装饰,而常常会是将装饰看作代理,所以大家一定要多留心,装饰模式是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案;而代理模式则是给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用。装饰模式应该为所装饰的对象增加功能;代理模式对代理的对象施加控制,但不对对象本身的功能进行增加。




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peak wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值