溫故而知新 設計模式之Builder

2021-09-05 22:33:50 字數 2850 閱讀 1722

builder模式主要用於以下場景:

需要建立乙個較複雜的大物件例項,並且構成該物件的子物件可能經常會發生變化,但是組成大物件的演算法卻相對穩定。

比如:我們做b/s開發時,經常會遇到一些系統要求支援模板/**切換,乙個完整的頁面由若干子模組組成,不管模板如何變換,子模組的內容/位置如何變化,但組成頁面的演算法即相對固定。

我們假定每個頁面由header,body,footer三個基本模組組成,先抽象出來:

#region

把不依賴具體細節的部分(即相當穩定,不變的部分)抽象出來

public

inte***ce

ishow

//////

頁面頭部 抽象類

///

public

abstract

class

header : ishow

//////

頁面主體 抽象類

///

public

abstract

class

body : ishow

//////

頁面底部 抽象類

///

public

abstract

class

footer : ishow

//////

頁面基類 抽象類

///

public

class

mainpage

getreturn

_lstparts;}}

public

void

show()

console.write(

"頁面構建完畢!");

}}//////

建立器 抽象類

///

public

abstract

class

builder

#endregion

客戶端程式依賴於上面的抽象:

//////

客戶程式

///

public

class

pagemanager

public

void

show()}

最後完成具體模板的實現 :

#region

spring風格的具體頁面及建立器

public

class

springheader : header

}public

class

springbody : body

}public

class

springfooter : footer

}public

class

springbuilder : builder

public

override

void

buildheader()

public

override

void

buildbody()

public

override

void

buildfooter()

public

override

mainpage getpage()

}#endregion

#region

summer風格的具體頁面及建立器

public

class

summerheader : header

}public

class

summerbody : body

}public

class

summerfooter : footer

}public

class

summerbuilder : builder

public

override

void

buildheader()

public

override

void

buildbody()

public

override

void

buildfooter()

public

override

mainpage getpage()

}#endregion

我們還是利用反射來解除最終具體型別的依賴:

xml version="1.0" encoding="utf-8" 

?>

<

configuration

>

<

>

<

add 

key="assemblyname"

value

="builder"

/>

<

add 

key="buildertype"

value

="builder.springbuilder"

/>

>

configuration

>

主程式using

設計模式之組合模式,溫故而知新。

概述 組合模式有時候又叫做部分 整體模式,它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。將物件組合成樹形結構以表示 部分 整體 的層次結構。composite模式使得使用者對單個物件和組合物件的使用具...

溫故而知新篇

2017年7 21日 問題 1 今天想到中興演算法大賽的乙個問題,鏈結在此 賽題主要針對尋找最優路徑,本人採用迪傑斯特拉演算法來做的,但是針對尋找最優路徑時,迪傑斯特拉演算法其實是有漏洞的,它採用類似貪心演算法的意思,每次都通過比較下乙個可達節點之間的權值大小來決定下一步的路徑,正常情況下,採用這樣...

溫故而知新

堆排 建立堆,維護堆的屬性 一次拿掉乙個,然後維護屬性,二分的結構 使得維護屬性只要logn的時間 冒泡也是一次拿走乙個 但是線性的結構 每次沒有節省時間 快排 一次確定 乙個值的位置,然後二分,縮小問題的範圍。floyd找最短 一次更新 將狀態改為經過固定點的 最短距離 迴圈 遍歷每個點,則結果為...