職責(zé)
- 動態(tài)地為一個對象增加新的功能
- 裝飾模式是一種用于代替繼承的技術(shù)妈嘹,無須通過繼承增加子類就能擴展對象的新功能初嘹,使用對象的關(guān)聯(lián)關(guān)系代替繼承關(guān)系刨晴,更加靈活霹琼,同時避免類型體系的快速膨脹
UML
實現(xiàn)細節(jié)
- Component抽象構(gòu)件角色
真實對象和裝飾對象有相同的接口。這樣丰嘉,客戶端對象就能夠以與真實對象相同的方式同裝飾對象交互 - ConcreteComponent具體構(gòu)件角色(真實對象)
io 流中的FileInputStream夯到、FileOutputStream - Decorator裝飾角色
持有一個抽象構(gòu)件的應(yīng)用。裝飾對象接受所有客戶端的請求饮亏,并把這些請求轉(zhuǎn)發(fā)給真實的對象耍贾,這樣,就能在真實對象調(diào)用前后增加新的功能 - ConcretDecorator具體裝飾角色
負責(zé)給構(gòu)件對象增加新的責(zé)任
代碼實現(xiàn)
package com.amberweather.decorator;
/**
* Component抽象構(gòu)件角色
* @author HT
*
*/
public interface ICar {
void move();
}
//ConcreteComponent具體構(gòu)件角色(真實角色)
class Car implements ICar{
@Override
public void move() {
System.out.println("陸地上跑");
}
}
//Decorator裝飾角色
class SuperCar implements ICar{
private ICar car;
public SuperCar(ICar car) {
super();
this.car = car;
}
@Override
public void move() {
car.move();
}
}
//ConcretDecorator具體裝飾角色
class FlyCar extends SuperCar{
public FlyCar(ICar car) {
super(car);
}
public void fly(){
System.out.println("在天上飛");
}
@Override
public void move() {
fly();
super.move();
}
}
//ConcretDecorator具體裝飾角色
class WaterCar extends SuperCar{
public WaterCar(ICar car) {
super(car);
}
public void swim(){
System.out.println("在水上跑");
}
@Override
public void move() {
swim();
super.move();
}
}
package com.amberweather.decorator;
public class Client {
public static void main(String[] args) {
Car car = new Car();
car.move();
System.out.println("----增加新的飛行功能----");
FlyCar flyCar = new FlyCar(car);
flyCar.move();
System.out.println("----增加新的水上游功能----");
WaterCar waterCar = new WaterCar(flyCar);
waterCar.move();
}
}
裝飾器的實例
Reader r = new BufferedReader(new InputStream(new FileInputStream(new File("D:/a.txt"))));
總結(jié)
裝飾模式降低系統(tǒng)的耦合度路幸,可以動態(tài)的增加或刪除對象的職責(zé)荐开,并使得需要裝飾的具體構(gòu)建類和具體裝飾類可以獨立變化,以便增加新的具體構(gòu)建類和具體裝飾類简肴。
裝飾模式和橋接模式的區(qū)別
兩個模式都是為了解決過多子類對象的問題晃听,但他們的誘因不一樣。橋接模式是對自身現(xiàn)有的機制沿著多個維度變化砰识,是既有部分不穩(wěn)定能扒。裝飾模式是為了增加新的功能。