所有的例子均**與實際開發專案
本節介紹組合模式的使用–商品結果排序評分系統
首先還是重複一下:設計模式是思路,而不是一味套用,如果業務場景和功能需求恰好吻合,那最好不過;如果有偏差,一定要具體情況具體分析,更具實際場景選擇合適的模式型別(注意,是型別,並不特定指某種模式,有的時候乙個場景多種模式都可以做)
本節所舉得例子為商品結果排序評分系統,也就是很多專案中,在比較重要任何事物查詢完畢後,會有乙個排序過程,比如在**上搜尋完商品後那個商品列表的排序過程。而且其複雜度當然遠遠超過資料中sql語句可以完成的程度(當然不排除有公司把邏輯直接寫入到儲存過程中,但是這種情況不做**),所以需要乙個完整的評分系統來對結果進行排序,高分排前,低分置後。
ⅰ 【分析階段】———————————
a.首先分析業務功能(功能需求):類似於上面所述的,就是對結果進行排序,高分前,低分後。再深入到實現**層面,就是多層次的權重分數計算了,這個類似大家學校裡,最終期末總評分,30%平時分,70%考試分乙個道理;
b.然後分析擴充套件性(非功能需求):主要變化會在哪?當然毫無疑問就是:
好了,結合上面兩點,你會發現,這有點乙個「樹」的意思了,不是麼?請看下面這個圖
左邊乙個一般的樹圖,類似資源管理器的列表單,這個摘自《研磨設計模式》p392頁的組合模式章節配圖
右邊是我剛剛所說的業務功能的分析圖,乙個商品的綜合總評分分為「商品評分」與發布該商品的「店鋪評分」,分別佔總評分的80%與20%,然後其下面又分別有子評分標準,以此類推,應該不難理解
這個時候,當然需要你對組合模式還是有了了解,至少要有印象,知道有這麼乙個模式可以作為備選,然後一比較,發現確實也湊巧,這個例子非常符合組合模式,而且看起來至少目前不需要做太大改動,已經可以滿足需求了。那就開始設計吧!
ⅱ【設計階段】——————————————————-
類圖設計如下,以下中上半部分摘自《研磨設計模式》p396 圖15.1 ,下面為我基於他的圖進行的部分修改,即為我的組合模式的設計
好了,繼續對上面的設計做一些說明:
身份對應:
具體實現,我結合**示例進行說明:
/**
* 評分計算基類
* 這裡我略掉了一些什麼addchild,removechild等方法的說明,這個大家需要自行加入
*/public abstract class scorecalculator
}//注意,這裡就用了模板方法的思想,上面所做的一切都是不變的,就是計算子節點的分數然後彙總
//那統計完子節點的了,自己還要進一步做處理吧?畢竟有些簡單的加減乘除就解決了,有些可還有複雜的邏輯
totalscore = morecalculate(totalscore);
return totalscore;
}//抽象方法,讓子類自己去實現
protected abstract int morecalculate(int currenttotalscore);
}public class scoreentry
對於具體的實現類來說,就比較清晰了,實現該實現的方法就好了
/*
* 店鋪分數計算規則,其還帶有子類規則a1,a2
* 至於商品分數計算規則的思路就差不多了,這裡就只舉此乙個
*/public class shopcalculator extends scorecalculator
}
不知道大家是否能夠順利理解,畢竟這個例子是實際專案,邏輯相對複雜,篇幅問題我也只能選擇核心**給出,所以難免會看著有點困難,沒關係,重點看我有注釋的那幾行便可,若有問題可以回帖發問~
好了,繼續還有一點收尾,那既然這棵樹「種好了」,那怎麼來使用呢?設計模式不僅僅要便於擴充套件,也要便於使用,那我們就來看看如何搭建起這個樹結構,也就是上面畫圖中,那個client怎麼呼叫了
//對吧,其實很簡單,new出節點,然後通過addchild建立起雙方的父子關係便可了
//總分統計
scorecalculator totalcal = new totalcalculator();
//商品統計,數字是在上級中的所佔權重
scorecalculator goodscal = new goodscalculator(0.8);
//店鋪統計
scorecalculator shopcal = new shopcalculator(0.2);
//a1統計
scorecalculator a1cal = new a1calculator(0.3);
//a2統計
scorecalculator a2cal = new a2calculator(0.7);
...(略)
//好了,把相互的關係整理起來!
goodscal.addchild(a1cal);
goodscal.addchild(a2cal);
...totalcal.addchild(goodscal);
totalcal.addchild(shopcal);
//最後,執行計算就ok了!無窮的遞迴就在這一刻開始
int finalscore = totalcal.calculatescore();
ⅲ【核查階段】———————————————————–
好了,到這裡為止,這個樣例算是分析完了,只是還查了一點,什麼呢?檢查!
就是檢查這個最終的開發結果是不是達到的之前的設計目的:
可見,目的都算是達到了,這個模式的使用就算是合格了!
在這裡,大家發現我其中用上了模板模式,其實在這個以組合模式為核心的模組裡裡外外還包圍著很多其他模式來進行輔助,這裡我為了避免影響都沒有寫出來了,有點像變形金剛合體一樣。這依舊說明了一點:
模式為思想,方法不固定,靈活變通使用才是硬道理!
組合模式 設計模式 組合模式
1.需求分析 假設要給乙個大公司做辦公管理系統,公司有人力資源部 財務部等,然後公司在其他城市還有分公司,分公司也有自己的人力資源部 財務部等,要求總公司 分公司以及各部分成樹狀結構管理。要完成這麼乙個系統,為了有乙個更好的設計,方便開發的展開,就需要了解乙個設計模式 組合模式。2.定義 將物件組合...
設計模式 組合模式 組合模式使用
目錄 組合模式概括 組合模式使用場景 定義 將物件組合成樹形結構以表示 部分 整體 的層次結構 作用 使客戶端對單個物件和組合物件保持一致的處理方式 使用場景 1.希望客戶端可以忽略組合物件與單個物件的差異時 2.處理乙個樹形結構時 優點 清楚的定義分層次的複雜物件,表示物件的全部或部分層次 讓客戶...
設計模式 組合設計模式
組合模式 composite pattern 又稱部分整體模式,用於把一組相似的物件當做乙個單一的物件,組合模式依據樹形來組合物件,用來表示部分以及整體層次,為結構型設計模式,它建立來物件組的樹形結構。意圖 將物件組合成樹形結構以表示 部分 整體 的結構層次,組合模式使得使用者對單個物件和組合物件的...