Java設計模式 內功修煉 結構型 裝飾者模式

2021-09-23 20:25:22 字數 1656 閱讀 6639

裝飾模式(decorator pattern):動態地給乙個物件增加一些額外的職責,就增加物件功能來說,裝飾模式比生成子類實現更為靈活。裝飾模式是一種結構型設計模式。

從其定義可以看出,裝飾者模式起到擴充套件功能的作用,也是一種替代繼承的技術,是合成復用原則的一種體現。

以按鈕舉例:可以利用裝飾者裝修其大小,文字設定,背景等等。

某公司要開發一套圖形介面構件庫,提供大量基本控制項,如窗體、文字框、列表框等等。但是在使用該控制項庫時,使用者經常要求定製一些特效顯示效果,如滾動條,帶黑邊框的文字框等等,我們先看版本1實現方式。

我們在這種實現方案上:實現帶滾動條的方式是繼承window視窗類,然後在子類中實現滾動條相關的方法,其他的控制項以及功能也是通過繼承實現的。

上述方法的缺點很明顯:子類數量過多,試想要擴充新功能,比如更換乙個背景顏色呢?每個控制項還得再繼承乙個控制項,很**觀,因此使用裝飾者模式產生版本2

先看下裝飾者模式的原理圖:

我們理解下上圖:

結合裝飾者模式,我們給出上述問題的更好的解決方案

根據上面的講解,scrollbardecorator是實現滾動條功能的關鍵,下面看下**,如何實現將乙個窗體加上滾動條:

class scrollbardecorator extends  componentdecorator

public void display()

public void setscrollbar()

}

在透明裝飾模式中,要求客戶端完全針對抽象程式設計,裝飾模式的透明性要求客戶端程式不應該將物件宣告為具體構件型別或具體裝飾型別,而應該全部宣告為抽象構件型別。對於客戶端而言,具體構件物件和具體裝飾物件沒有任何區別。也就是應該使用如下**:

component c, c1;

c=new concretecomponent();

c1=new concretedecorator(c);

c1.display();

透明裝飾模式的設計難度較大,而且有時我們需要單獨呼叫新增的業務方法。為了能夠呼叫到新增方法,我們不得不用具體裝飾型別來定義裝飾之後的物件,而具體構件型別還是可以使用抽象構件型別來定義,這種裝飾模式即為半透明裝飾模式,也就是說,對於客戶端而言,具體構件型別無須關心,是透明的;但是具體裝飾型別必須指定,這是不透明的。

非透明模式不能實現對同一物件的多次裝飾,看個例子。

component c;

c=new concretecomponent();

concretedecorater c1;

c1=new concretedecorater(c);

//c1中實現了新的方法

思考為什麼非透明裝飾模式不能實現乙個物件的多次裝飾呢?

Java設計模式 內功修煉 結構型 組合模式

組合模式 composite pattern 組合多個物件形成樹形結構以表示具有 整體 部分 關係的層次結構。組合模式對單個物件 即葉子物件 和組合物件 即容器物件 的使用具有一致性,組合模式又可以稱為 整體 部分 part whole 模式,它是一種物件結構型模式。現在要開發一款防毒軟體,要求能對...

java結構型設計模式 組合模式

1 模式理解 組合模式就是把兩個物件放在乙個物件裡嘍,確切的說是乙個物件包含別的物件的集合,好比你一老闆可以有很多個員工,夠清除了吧 2 運用場景 單對多或者多對單的時候可以使用組合模式 3 示例 先建立員工物件 public class staff public string getname pu...

java結構型設計模式 裝飾模式

1 模式理解 這個模式還是很好理解的,裝飾嘛,就像我們裝修房子一樣,就是在原有的基礎上進行改進。結構模式就是被裝飾的類都統一實現乙個介面,裝飾類也實現這個介面,用來做裝飾的類統一繼承這個裝飾類。舉個例子,有乙個小男孩,裝飾一下,有乙個可愛的小男孩,可愛就是用來裝飾的,裝飾完之後小男孩還是小男孩,就是...