Aha!設計模式 11 BUILDER 2

2021-09-01 11:35:53 字數 1295 閱讀 3301

動機

《設計模式》中關於builder動機的說明使用的是rtf文件格式轉換的例子。這個例子本身很容易理解,這裡就不再重複了。本文只講作者本人的見解。

還是那一招

本**提到過:大部分情況下,設計模式也好,物件導向也好其實就是一招,多型。這個結論對於builder模式同樣使用。具體到《設計模式》中的例子,希望變化的就是輸出的型別或者說格式。基於這個想法,即使我們沒有學習設計模式,也可以進行基本的思考。

按照上面的設計,當我們希望追加一種新的輸出格式時,只要增加新的具象類就可以了。

足夠簡單的類

上述設計在輸出內容簡單的時候沒有什麼問題,當輸入內容比較複雜的時候,會有一些問題:

除了真正的輸出以外,至少還會包含另外的處理,例如資料結構的遍歷,有的時候也會包含解析的內容。

各個類中處理資料共同結構(頁,段落等)的部分應該很類似,只是具體輸

出的部分有所不同。

解決這些問題的方法就是進一步分離共通處理,讓filewriter只處理真正不同的部分,其他資料遍歷等內容則交給其他的類。

走到這一步,基本就和builder模式沒啥區別了。下圖是builder設計模式中動機部分的類圖。

這兩個類圖主要有三個區別:

類名不同,作者使用的writer而不是converter,是希望更加明確地表示類的功能只包含最後輸出的功能。

builder/writer的位置。這兩個名詞都是用來指定converter/writer資料成員的名稱的。《設計模式》書中標在了rtfreader一側,而作者的圖中標在了writer一側。哪種情況正確,大家可以參照uml方面的書籍。

作者的例子另外增加了begin/end方法,這種方式下對應的具象類會比較容易實現。

無論誰是誰非,builder的思想都是不變的。

作者觀點

乙個類只幹一件事。

大道至簡,這個原則應該可以很好地詮釋這句話。

Java設計模式(五) 建造者模式Builder

我們要建造乙個複雜的產品。比如 神舟飛船 iphone。這個複雜的產品的建立,有這樣乙個問題需要處理 要構建的物件,宇宙飛船 package com.iter.devbox.builder 宇宙飛船 author shearer public class airship public orbital...

Aha!設計模式 58 裝飾模式 2

示例 我們從前一篇文章中選取網路資料處理的例子寫一段python 中首先定義了資料處理基類dataprocessor,它有乙個process操作用於處理資料。datacreater是乙個普通的派生類,用於初始化資料。然後是decorator類,它定義了乙個資料成員processor,用於管理裝飾物件...

Aha!設計模式 78 命令模式 3

結構 參與者 協作 client建立乙個concretecommand物件並指定它的receiver物件。某invoker物件接收該concretecommand物件。invoker呼叫concretecommand物件的執行操作。concretecommand物件呼叫receiver的一些操作以執...