軟體構造設計模式(上)

2021-10-07 18:39:55 字數 3985 閱讀 8773

visitor訪問者模式

observer觀察者模式

template模版模式

decorator裝飾器模式

adapter介面卡模式

指物件有某個行為,但在不同的場景中,該行為有不同的實現演算法。定義一系列演算法類,將每乙個演算法封裝起來,並讓它們可以相互替換。主要目的是將演算法的定義和使用分開,也就是將演算法的行為和環境分開,將演算法的定義放在專門的策略類中,每乙個策略類封裝乙個實現演算法。 而使用演算法的環境中針對抽象策略程式設計,而不是針對實現程式設計,符合依賴倒置原則。

public

inte***ce

strategy

public

class

method1

implements

strategy

}

public

classxx.

....

.}

newxx(

).function

(new

method1()

,引數)

;

其中function方法表示可以採取多種策略來實現的功能,相當於把這個功能具體的實現委派給了實現strategy介面的類,也就是在method1中寫具體的**,而原本的function方法只起到了delegation的作用。

對於沒有實現策略模式的工程來說,strategy和method1是為了實現策略模式而新增的介面和類,function是已經實現的方法。在擴充套件為策略模式時,除了新增strategy和method1之外,還需要將function具體實現改為delegation,即將strategy作為引數傳入,而客戶端呼叫的依然是function這個方法。

把結構和資料分開,編寫乙個訪問者,去訪問資料結構中的元素,然後把對各元素的處理全部交給訪問者類。這樣,當需要增加新的處理的時候,只需要編寫新的訪問者類,讓資料結構可以接受訪問者的訪問即可。

public

class

xx}

public

inte***ce

visitor

public

class

visitorimpl

implements

visitor

visitor visitor =

newvisitorimpl()

; xx.

accept

(visitor)

;

反向delegation,直接將xx類作為引數傳給visit方法,根據不同的類實現不同的visit。

要實現visitor模式,除了新增visitor介面和實現之外,在原有的類中加入accept方法來實現反向delegation,相當於把自己交給了visitor,而客戶端依然呼叫xx的accept方法。

定義物件間的一種一對多的依賴關係,以便當乙個物件的狀態發生改變時,所以依賴於它的物件都得到通知並自動重新整理。

public

class

subject

}public

void

attach

(observer observer)

}

public

abstract

class

observer

public

class

xxobserver

extends

observer

@override

public

void

update()

}

new

xxobserver

(subject)

;//只需要new乙個粉絲的例項即可

在這個模式中,偶像類在需要將改變通知給粉絲類時,要呼叫內部的notifyallobservers方法,對粉絲遍歷,呼叫它們的update方法,還要提供允許粉絲註冊的attach方法;同時,粉絲類要在構造器中進行註冊,還要有update()方法用來列印資訊;而客戶端只需new乙個粉絲的例項,把偶像的例項作為引數傳入即可。

定義乙個操作中演算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以不改變演算法的結構即可重定義該演算法的某些特定步驟。

public

abstract

class

orderprocesstemplate

public

final

void

processorder()

public

class

xxorder

extends

orderprocesstemplate

orderprocesstemplate order  =

newxxorder()

; order.

processorder()

;

模版模式,顧名思義,是指做事情的步驟一樣,但具體的實現方法不同。因此,需要在抽象介面定義乙個具體的類,內部按順序呼叫各個方法;在這個抽象介面的具體類中override這些方法,來實現內部函式不同的目的;最後客戶端只需要呼叫儲存順序的那個類即可。

動態為物件新增功能。是一種替換繼承關係的方案,無需通過繼承增加子類就能擴充套件物件的新功能。使用物件的關聯關係代替繼承關係。

public

inte***ce

stack

public

class

stack1

implements

stack

//實現最基礎的stack功能

public

abstract

class

stack2

implements

stack

//用於decorator的抽象類

public stack3 extends

stack2

implements

stack..

....

}

new

stack3

(stack1 stack)

;

如果要實現裝飾器模式,stack1作為已經存在的類,實現了stack介面,stack2和stack3都是需要新新增的類,由於實現裝飾的功能。還可以拓展新的類stack4,stack5等等,客戶端只需:new stack5(new stack4(new stack3(stack1 stack)))。注:對於stack1已經實現的功能,stack3,4,5需要通過delegation來實現。

將乙個類的介面轉換成客戶希望的另外乙個介面,使得原本由於介面不相容而不能一起工作的那些類能一起工作。介面卡模式是乙個比較簡單的delegation,利用delegation,使得客戶端能夠使用原本引數不適配的方法。

public

class

old}

public

inte***ce

new

public

class

new1

implements

new}

new xx

=new

new1()

; xx.

xx(x1,x2,x3,x4)

;

軟體構造 設計模式對比

static factory 和 abstract factory 同 簡化了建立的過程。主要解決介面選擇的問題。不同 static factory讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。每次增加乙個產品時,都需要增加乙個具體類和物件實現工廠,使得系統中類的個數成倍增...

軟體構造複習 設計模式2

產品 工廠都是介面,具體產品 具體工廠實現介面,每個工廠只生產乙個產品 抽象工廠和工廠類似,只是乙個工廠可以生產一系列配套的元件,比如windows的視窗 按鈕等等,不再贅述 當載入物件代價較大時,可用 快取,避免重複載入 另一方面,也可用作 防火牆 將內外部資料隔離 類似新聞推送,明星維護觀察者佇...

設計模式 構造者模式

原始碼 from 萬方資料 朱進 構造者模式使用場景 include define buide c define finished 1 define unfinished 0 typedef struct splane plane typedef struct sconcretebuild conc...