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