天天看點

設計模式(二)之裝飾模式(Decorator Pattern)

裝飾模式      
1、描述
動态的給對象添加一些額外的職責。在許多設計中,可能需要改進類的某個對象的功能,而不是該類建立的全部對象。      
2、使用場景
希望動态的增強類的某個對象的功能,而又不影響到該類的其他對象。eg:我們現在有一個車輛生成線,該生成線生産的汽車加一次油能夠行使100公裡。但是我們現在要一輛加一次油能夠行使150公裡的汽車,我們現在不可能去重新造一個生産線,也不能去修改現有的生産線,那我們現在改怎麼完成這項工作呢?一種好的解決辦法就是利用該生成線生成的汽車,我們對其進行改裝,對其加一個郵箱,使其能夠行使150公裡。      
3、模式中的角色
抽象元件(AbstractComponent):抽象元件是一個抽象類。抽象元件定義了“被封裝者”需要進行“裝飾”的方法。      
具體元件(ConcreteComponent):具體元件是抽象元件的一個子類,具體元件的執行個體稱作“被裝飾者”。      
裝飾(Decorator):裝飾也是抽象元件的一個子類,但裝飾還包含一個抽象元件聲明的變量以及儲存“被裝飾者”的引用。裝飾可以是抽象類也可以是一個非抽象類,如果是非抽象類,那麼該類的執行個體稱作“裝飾者”。      
具體裝飾(ConcreteDecorator):具體裝飾是裝飾的一個非抽象子類,具體裝飾的執行個體稱作“裝飾者”。      
4、類的關系圖
設計模式(二)之裝飾模式(Decorator Pattern)
5、代碼實作

根據上面的例子和類圖給出代碼實作

 抽象元件:car

package org.sunday.decorator;

/**
 * 抽象元件
 * @author sunday
 * 2014-1-7
 */
public abstract class Car {
	public abstract int runDistance();
}
           

 具體元件:ConcreteCar

package org.sunday.decorator;

/**
 * 具體元件
 * @author sunday
 * 2014-1-7
 */
public class ConcreteCar extends Car {
	public final int DISTANCE = 100;

	@Override
	public int runDistance() {
		return DISTANCE;
	}
}
           

裝飾:DecoratorCar

package org.sunday.decorator;

/**
 * 裝飾
 * @author sunday
 * 2014-1-7
 */
public abstract class DecoratorCar extends Car {
	protected Car car;
	
	public DecoratorCar() {}
	
	public DecoratorCar(Car car) {
		this.car = car;
	}
} 
           

具體裝飾:ConcreteDecoratorCar 

package org.sunday.decorator;

/**
 * 具體裝飾
 * @author sunday
 * 2014-1-7
 */
public class ConcreteDecoratorCar extends DecoratorCar {
	public final int EXT_DISTANCE = 50;
	
	public ConcreteDecoratorCar(Car car) {
		super(car);
	}

	@Override
	public int runDistance() {
		return this.car.runDistance() + extRunDistance();
	}
	
	private int extRunDistance() {
		return EXT_DISTANCE;
	}
}
           

 測試:

package org.sunday.decorator;

public class Test {
	public static void main(String[] args) {
		Test test = new Test();
		Car concreteCar = new ConcreteCar();
		test.runDistanceLog(concreteCar);
		Car concreteDecoratorCar = new ConcreteDecoratorCar(concreteCar);
		test.runDistanceLog(concreteDecoratorCar);
	}

	private void runDistanceLog(Car car) {
		int distance = car.runDistance();
		System.out.println("這輛車能行使:" + distance + "公裡");
	}
}
           

運作結果如下:

設計模式(二)之裝飾模式(Decorator Pattern)