1. 程式人生 > >設計模式-裝飾模式

設計模式-裝飾模式

裝飾模式的UML類圖

在這裡插入圖片描述

你會發現,在裝飾模式中,除了對抽象介面的實現,更重要的還有對抽象介面的聚合。 裝飾模式一般適應於常為系統已有的功能動態的新增更多的功能在這裡插入圖片描述 1、將會更新的功能的進行抽象

package decorate_1;
public interface Component {
	public void opration();
}

2、原有功能實現

package decorate_1;
public class ConcreteComponent implements Component {
	@Override
	public void opration() {
		System.
out.println("原有功能"); } }

3、將要附加裝飾進行抽象

package decorate_1;
//為子類提供模板
public abstract class Decorator implements Component{
	Component base = null;
	@Override
	public void opration() {
		if(base != null){
			base.opration();
		}
	}
	public void setComponent(Component base){
		this.base = base;
	}
}

4、具體裝飾類A

package decorate_1;
public class ConcreteDecoratorA extends Decorator {
	private String addedState;
	@Override
	public void opration() {
		super.opration();	//先執行原有的operation()
		//...下面為本類自帶的特殊邏輯和其他具體操作
		this.addedState = "abc";
		System.out.println("ConcreteDecoratorA operations");
	}
	public void printState
(){ //該自帶的特殊方法 System.out.println(this.addedState); } }

5、具體裝飾類B

package decorate_1;
public class ConcreteDecoratorB extends Decorator {
	@Override
	public void opration() {
		super.opration();
		this.otherOperation();
	}
	public void otherOperation(){
		System.out.println("ConcreteDecoratorB operations");
	}
}

6、Main客戶端

package decorate_1;
public class Main {
	public static void main(String[] args) {
		ConcreteComponent concreateComponent = new ConcreteComponent();
		ConcreteDecoratorA cda = new ConcreteDecoratorA();
		ConcreteDecoratorB cdb = new ConcreteDecoratorB();
		//裝飾
		cda.setComponent(concreateComponent);
		cdb.setComponent(cda);
		//開始執行
		cdb.opration();
	}
}

使用裝飾模式的一個例子

裝飾模式就像穿衣服,如穿衣服需要先穿內褲,再穿上衣或者褲子,或者再加個外套, 比如哪天你不想穿外套,或者在外套外再加層風衣,穿衣的方式是多樣的。 如: 將Person作為ConcreteComponent,其中show()顯示姓名。 Component介面中抽象出show()方法。 將穿衣服、褲子、鞋子抽象成Decorator,並具體實現ConcreteDecorator。