`

设计模式(9)-结构型-装饰模式(Decorator)

 
阅读更多

概述

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。可以简称为"修修补补"


适用性

  • 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 2.处理那些可以撤消的职责。
  • 3.当不能采用生成子类的方法进行扩充时。

参与者

  • 1.Component 定义一个对象接口,可以给这些对象动态地添加职责。
  • 2.ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。
  • 3.Decorator 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
  • 4.ConcreteDecorator 向组件添加职责。

其基本类图如下图所示:


示例:


package com.sql9.structured;


abstract class Component {
	public abstract void draw();
}

class ConcreteComponent extends Component {
	
	private String name;
	
	public ConcreteComponent(String name) {
		this.name = name;
	}

	@Override
	public void draw() {
		System.out.println(String.format("ConcreteComponent - %s", name));
	}
	
}

abstract class Decorator extends Component {
	protected Component internalComponent;
	
	public void setComponent(Component c) {
		this.internalComponent = c;
	}
	
	@Override
	public void draw() {
		if (internalComponent != null) {
			internalComponent.draw();
		}
	}
}

class ConcreteDecorator extends Decorator {
	
	private String customName;
	
	public ConcreteDecorator(String name) {
		this.customName = name;
	}
	
	@Override
	public void draw() {
		extraDraw();
		super.draw();
	}
	
	protected void extraDraw() {
		System.out.println("Draw extra action in ConcreteDecorator...");
	}
}


public class DecoratorTest {

	public static void main(String[] args) {
		ConcreteComponent c = new ConcreteComponent("This is the real component");
		ConcreteDecorator d = new ConcreteDecorator("This is a decorator for the component");
		d.setComponent(c);
		d.draw();
	}
}

结果:


Draw extra action in ConcreteDecorator...
ConcreteComponent - This is the real component

<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; /* wide1 */ google_ad_slot = "8564482570"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics