設計模式之裝飾者模式

2021-09-28 18:17:42 字數 2114 閱讀 1823

為什麼需要裝飾者模式?在不允許直接修改原**的情況下進行擴充套件時需要使用裝飾者模式。裝飾者模式動態的將責任(行為)附加到物件身上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。 這就是設計中的開放——關閉原則,對擴充套件開放,對修改關閉。以下時關於裝飾者模式的一些相關特徵:

裝飾者與被裝飾者擁有相同的超類

可以用乙個或多個裝飾者去包裝乙個物件

裝飾者和被裝飾者擁有相同的超類,所以在任何需要原始物件(被包裝的)的場合,可以用裝飾過的物件來替代它

裝飾者可以在所委託被裝飾者的行為之前與/或之後,加上自己的行為,以達到特定的目的。

物件可以在任何時候被裝飾,所以可以在執行時動態的,不限量的使用裝飾者來裝飾物件。

我們都知道,乙個專業中包括主修課程和選修課程,主修課程和選修課程都是可以獲得學分的,而一般來說主修課程就體現了乙個專業的型別(是哪個專業)。現在就通過這個例子使用裝飾者模式來實現一下這種情況。

其中會包括超類/最高端介面、元件(被裝飾者)、裝飾者。那麼超類/最高端介面就應該是專業,元件就應該是專業中的主修課程,裝飾者就應該是專業中的選修課程。前面說過:裝飾者可以在所委託被裝飾者的行為之前與/或之後,加上自己的行為,以達到特定的目的。這裡面是通過選修課程獲得學分,以達到專業允許畢業學分和專業組成的目的。

超類(專業):

package decorator2;

/** * 裝飾者模式中的超類(專業)

*/public abstract class abstractmajor

/*** 可獲得的學分

* @return

*/public abstract double cost();

}

元件(biologysubject主修生物學-----被裝飾者):

package decorator2;

/** * 主修生物學

*/public class biologysubject extends abstractmajor

/*** 學分計算

* @return

*/@override

public double cost()

}

裝飾者共同實現的介面或繼承的抽象類:

package decorator2;

/** * 選修課

*/public abstract class abstractelectivesubject extends abstractmajor

裝飾者a:

package decorator2;

/** * 英語選修

*/public class englishsubject extends abstractelectivesubject

@override

public string getdescription()

@override

public double cost()

}

裝飾者b:

package decorator2;

/** * 高數選修

*/public class mathematicssubject extends abstractelectivesubject

@override

public string getdescription()

@override

public double cost()

}

測試類:

package decorator2;

public class test

}

測試結果就不貼上了,各位看官可以自己嘗試。

前面由提到,裝飾者提供了比繼承更有彈性的解決方案,但是在**中都是使用了繼承,**我們使用繼承是達到了「型別匹配」的效果,而不是通過繼承來獲得行為(方法),就像前面提到的「裝飾者與被裝飾者擁有相同的超類」,這裡面元件(專業)獲得新的行為(學科)是通過組合物件獲得的,不是通過繼承獲得的。

設計模式之 裝飾者模式

一 裝飾者模式 裝飾者模式又稱為包裝模式。動態地給乙個物件增加新的職責。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式顧名思義就是對乙個物件進行裝飾,具體怎樣裝飾呢?那就是給這個物件不斷的增加職責方法。給乙個物件增加方法不簡單啊,用繼承或者直接在物件的類中增加方法。如果我們要對自...

設計模式之裝飾者模式

此模式動態將職責附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更具彈性的代替方案,以一圖一概括。要點1 裝飾者和被裝飾物件有相同的超型別。2 可以用乙個或多個裝飾者包裝乙個物件。3 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。4 物件可以在任何時候被裝飾,所以可...

設計模式之裝飾者模式

public abstract class beverage 返回當前飲品的 public abstract double cost 為了讓condiment decorator 調料裝飾者 能夠取代beverage,所以將它擴充套件至beverage類 public abstract class ...