設計模式-裝飾器模式

來源:《設計模式之禪》java

定義:動態的給一個對象添加額外的職責。設計模式

  1. 抽象構件Component:定義抽象構件接口。ide

  2. 具體構件ConcreteComponent:實現抽象構件接口,須要裝飾的對象就是它。this

  3. 抽象裝飾角色Decorator:定義裝飾角色接口或方法,屬性中有一個指向抽象構件的private變量。設計

  4. 具體裝飾類ConcreteDecorator:實現抽象裝飾角色。code

類圖:component

代碼:對象

抽象構件:繼承

/**
 * 
 */
package cc.rico.pattern.decorator;

/**
 * @author rico
 * 抽象構件
 */
public abstract class Component {
	
	/**
	 * 抽象構件方法
	 */
	public abstract void option();
}

具體構件:接口

/**
 * 
 */
package cc.rico.pattern.decorator;

/**
 * @author rico
 * 具體構件
 */
public class ConcreteComponent extends Component {

	/* (non-Javadoc)
	 * @see cc.rico.pattern.decorator.Component#option()
	 */
	@Override
	public void option() {
		System.out.println("###ConcreteComponent.option...");
	}

}

抽象裝飾器:

/**
 * 
 */
package cc.rico.pattern.decorator;

/**
 * @author rico
 * 抽象裝飾器
 */
public class AbstractDecorator extends Component {
	private Component component = null;
	
	public AbstractDecorator(Component component) {
		this.component = component;
	}

	/* (non-Javadoc)
	 * @see cc.rico.pattern.decorator.Component#option()
	 */
	@Override
	public void option() {
		component.option();
	}

}

具體裝飾器:

/**
 * 
 */
package cc.rico.pattern.decorator;

/**
 * @author rico
 * 具體裝飾器
 */
public class ConcreteDecorator extends AbstractDecorator {

	public ConcreteDecorator(Component component) {
		super(component);
	}
	
	/* 重寫父類(non-Javadoc)
	 * @see cc.rico.pattern.decorator.AbstractDecorator#option()
	 */
	@Override
	public void option() {
		this.decoration();
		super.option();
	}
	
	/**
	 * 裝飾方法
	 */
	private void decoration() {
		System.out.println("###ConcreteDecorator.decoration...");
	}

}
/**
 * 
 */
package cc.rico.pattern.decorator;

/**
 * @author rico
 * 具體裝飾類
 */
public class ConcreteDecorator1 extends AbstractDecorator {

	public ConcreteDecorator1(Component component) {
		super(component);
	}
	
	/* 重寫父類方法(non-Javadoc)
	 * @see cc.rico.pattern.decorator.AbstractDecorator#option()
	 */
	@Override
	public void option() {
		super.option();
		this.decoration();
	}
	
	/**
	 * 裝飾方法
	 */
	private void decoration() {
		System.out.println("####ConcreteDecorator1.decoration...");
	}

}

場景類:

/**
 * 
 */
package cc.rico.pattern.decorator;

/**
 * @author rico
 * 場景類
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Component component = new ConcreteComponent();
		component = new ConcreteDecorator(component);
		component = new ConcreteDecorator1(component);
		
		component.option();
	}

}


裝飾器模式優勢:

  1. 裝飾類和被裝飾類 不相互耦合。被裝飾類不用知道裝飾類的存在。裝飾類從外部擴展裝飾類的功能。

  2. 裝飾模式是繼承關係的一個替代方案。

  3. 裝飾模式能夠動態的擴展一個類的功能。

裝飾器模式缺點:

     多層裝飾類複雜度比較高。

使用場景:

  1. 擴展一個類的功能,或者給一個類添加附加功能。

  2. 須要動態的給一個類添加功能,還能夠動態的撤銷。

擴展:

相關文章
相關標籤/搜索