結構型模式之組合

重新看組合/合成(Composite)模式,發現它并不像自己想象的那么簡單,單純從整體和部分關系的角度去理解還是不夠的,并且還有一些通俗的模式講解類的書,由于其舉的例子太過“通俗”,以致讓人理解產生偏差,不過設計模式本身就是一種程序設計思想,不同的人當然會產生具有偏差性質的理解。

GOF對組合模式的定義是:將對象組合成樹形結構以表示“部分 -整體”的層次結構。 Composite使得用戶對單個對象和組合對象的使用具有一致性 。這里,“用戶對單個對象和組合對象的使用具有一致性”,這是Composite模式產生的效果。從表示形式來看,Composite表示的是“部分-整體”的關系,但是,往往忽略了效果。下圖是Composite模式的結構圖:

Composite模式的對象結果如下:

Composite類提供對Leaf類對象的管理方法,如Add(),Remove(),GetChild()方法,這些方法的定義可以有兩種方法:一個是放在Component的頂層父類中,這樣所有的子類(包括Leaf類)都會集成該方法,但Leaf類可以選擇不實現這些方法;另外一個是將對Leaf對象操作的方法放到Composite類中,并不是放到Component類中。現在以GOF所著書中所給的例子為例,寫出組合模式的代碼,類圖結構如下:

代碼如下:

 1 abstract class Graphic{
 2     
 3     public void Draw(){}
 4     public void Add(Graphic g){}
 5     public void Remove(Graphic g){}
 6     public Graphic GetChild(int index){return null;}
 7 }
 8 class Line extends Graphic{
 9     public void Draw(){
10         System.out.println("Draw a Line");
11     }
12 }
13 class Rectange extends Graphic{
14     public void Draw(){
15         System.out.println("Draw a Rectange");
16     }
17 }
18 class Text extends Graphic{
19     public void Draw(){
20         System.out.println("Draw a Text");
21     }
22 }
23 class Picture extends Graphic{
24     private Vector<Graphic> vec=new Vector<Graphic>();
25     public void Draw(){
26         for(Graphic g : vec){
27             g.Draw();
28         }
29     }
30     public void Add(Graphic g){
31         vec.add(g);
32     }
33     public void Remove(Graphic g){
34         try{
35             vec.remove(g);
36         }catch(Exception e){
37             
38         }
39     }
40     public Graphic GetChild(int index){
41         return vec.get(index);
42     }
43 }
44 public class Test{
45     public static void main(String[] args){
46         Picture p=new Picture();
47         p.Add(new Text());
48         p.Add(new Rectange());
49         p.Add(new Line());
50         p.Draw();
51         }
52 }
View Code

適用Composite模式的情況:

1、想要表示對象的部分-整體層次結構

2、希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。

第一句話很好理解,第二句話該怎么理解呢?我的理解是,如果有一個方法Visist(Component con){con.Draw();}實現一個動作,這時候它并不需要知道是處理一個葉子結點對象還是一個組合對象,對于傳進來的葉子結點對象,可以直接處理請求,如果是一個Composite,則將請求發給它的子部件,并且在轉發請求之前/后還可以執行一些輔助操作。有人舉過一個例子:文件和文件夾,該實現可以用組合模式,文件是Leaf,文件夾是Composite,我們可以單建文件對象,也可創建一個具有目錄結構的文件夾對象,文件夾下面可以放文件對象,也可以放文件夾對象。

為了提高系統的可復用性,有一些設計原則,其中有一條“組合/聚合復用原則”,就是優先使用“組合/聚合”,而非繼承,這里說的組合是對象組合,也就是一個對象在運行時期動態獲得其他對象的引用,從而達到不用繼承而能擴展功能的效果;顯然,對象組合的使用范圍更大,和這里的組合模式不是同一個概念,前者畢竟是一個“設計原則”,而后者則是一個成型的“模式”,原則的使用范圍當然更廣了。

通過今天的總結,對組合模式又有了進一步的認識,感謝GOF、《Java與模式》、《Thinking in Patterns》。

?

轉載于:https://www.cnblogs.com/codeMedita/p/7354847.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391689.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391689.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391689.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡原理筆記-三次握手

三次握手協議指的是在發送數據的準備階段&#xff0c;服務器端和客戶端之間需要進行三次交互&#xff1a; 第一次握手&#xff1a;客戶端發送syn包(synj)到服務器&#xff0c;并進入SYN_SEND狀態&#xff0c;等待服務器確認&#xff1b; 第二次握手&#xff1a;服務器收到syn包…

VB2010 的隱式續行(Implicit Line Continuation)

VB2010 的隱式續行&#xff08;Implicit Line Continuation&#xff09;許多情況下,您可以讓 VB 后一行繼續前一行的語句&#xff0c;而不必使用下劃線&#xff08;_&#xff09;。下面列舉出隱式續行語法的使用情形。1、逗號“&#xff0c;”之后PublicFunctionGetUsername(By…

flutter bloc_如何在Flutter中使用Streams,BLoC和SQLite

flutter blocRecently, I’ve been working with streams and BLoCs in Flutter to retrieve and display data from an SQLite database. Admittedly, it took me a very long time to make sense of them. With that said, I’d like to go over all this in hopes you’ll w…

leetcode 303. 區域和檢索 - 數組不可變

給定一個整數數組 nums&#xff0c;求出數組從索引 i 到 j&#xff08;i ≤ j&#xff09;范圍內元素的總和&#xff0c;包含 i、j 兩點。 實現 NumArray 類&#xff1a; NumArray(int[] nums) 使用數組 nums 初始化對象 int sumRange(int i, int j) 返回數組 nums 從索引 i …

Bigmart數據集銷售預測

Note: This post is heavy on code, but yes well documented.注意&#xff1a;這篇文章講的是代碼&#xff0c;但確實有據可查。 問題描述 (The Problem Description) The data scientists at BigMart have collected 2013 sales data for 1559 products across 10 stores in…

Android控制ScrollView滑動速度

翻閱查找ScrollView的文檔并搜索了一下沒有發現直接設置的屬性和方法&#xff0c;這里通過繼承來達到這一目的。 /*** 快/慢滑動ScrollView * author農民伯伯 * */public class SlowScrollView extends ScrollView {public SlowScrollView(Context context, Att…

數據特征分析-帕累托分析

帕累托分析(貢獻度分析)&#xff1a;即二八定律 目的&#xff1a;通過二八原則尋找屬于20%的關鍵決定性因素。 隨機生成數據 df pd.DataFrame(np.random.randn(10)*10003000,index list(ABCDEFGHIJ),columns [銷量]) #避免出現負數 df.sort_values(銷量,ascending False,i…

leetcode 304. 二維區域和檢索 - 矩陣不可變(前綴和)

給定一個二維矩陣&#xff0c;計算其子矩形范圍內元素的總和&#xff0c;該子矩陣的左上角為 (row1, col1) &#xff0c;右下角為 (row2, col2) 。 上圖子矩陣左上角 (row1, col1) (2, 1) &#xff0c;右下角(row2, col2) (4, 3)&#xff0c;該子矩形內元素的總和為 8。 示…

算法訓練營 重編碼_編碼訓練營后如何找到工作

算法訓練營 重編碼by Roxy Ayaz由Roxy Ayaz 編碼訓練營后如何找到工作 (How to get a job after a coding bootcamp) Getting a tech job after a coding bootcamp is very possible, but not necessarily pain-free.在編碼訓練營之后獲得技術工作是很有可能的&#xff0c;但不…

dt決策樹_決策樹:構建DT的分步方法

dt決策樹介紹 (Introduction) Decision Trees (DTs) are a non-parametric supervised learning method used for classification and regression. The goal is to create a model that predicts the value of a target variable by learning simple decision rules inferred f…

讀C#開發實戰1200例子記錄-2017年8月14日10:03:55

C# 語言基礎應用&#xff0c;注釋 "///"標記不僅僅可以為代碼段添加說明&#xff0c;它還有一項更重要的工作&#xff0c;就是用于生成自動文檔。自動文檔一般用于描述項目&#xff0c;是項目更加清晰直觀。在VisualStudio2015中可以通過設置項目屬性來生成自動文檔。…

iOS端(騰訊Bugly)閃退異常上報撲獲日志集成與使用指南

app已經上架并且有三次更新版本&#xff0c;今天市場部和顧客約談時&#xff0c;發現顧客的iphone 6 plus iOS 9.0.2上運行app點擊登錄按鈕時直接閃退&#xff0c;無法進入app里&#xff0c;這個問題還是第一次遇到&#xff0c;我下載了相應的模擬器版本&#xff0c; 并在上面運…

數據特征分析-正太分布

期望值&#xff0c;即在一個離散性隨機變量試驗中每次可能結果的概率乘以其結果的總和。 若隨機變量X服從一個數學期望為μ、方差為σ^2的正態分布&#xff0c;記為N(μ&#xff0c;σ^2)&#xff0c;其概率密度函數為正態分布的期望值μ決定了其位置&#xff0c;其標準差σ決定…

leetcode 338. 比特位計數

給定一個非負整數 num。對于 0 ≤ i ≤ num 范圍中的每個數字 i &#xff0c;計算其二進制數中的 1 的數目并將它們作為數組返回。 示例 1: 輸入: 2 輸出: [0,1,1] 示例 2: 輸入: 5 輸出: [0,1,1,2,1,2] 解題思路 偶數&#xff1a;和偶數除以2以后的數字&#xff0c;具有相…

r語言調用數據集中的數據集_自然語言數據集中未解決的問題

r語言調用數據集中的數據集Garbage in, garbage out. You don’t have to be an ML expert to have heard this phrase. Models uncover patterns in the data, so when the data is broken, they develop broken behavior. This is why researchers allocate significant reso…

為什么不應該使用(長期存在的)功能分支

Isn’t the git history in the picture above nice to work with? There are probably many problems in that repository, but one of them is most definitely the use of feature branches. Let’s see how such a bad thing became such a common practice.上面圖片中的g…

(轉) Spring 3 報org.aopalliance.intercept.MethodInterceptor問題解決方法

http://blog.csdn.net/henuhaigang/article/details/13678023 轉自CSDN博客&#xff0c;因為一個jar包沒引入困擾我好長時間 &#xff0c;當時正在做spring AOP 的一個小測試&#xff0c;總在報錯&#xff0c;最后發現自己是問題3&#xff0c;引入一個jar包得到了解決 一 開發環…

數據特征分析-相關性分析

相關性分析是指對兩個或多個具備相關性的變量元素進行分析&#xff0c;從而衡量兩個變量的相關密切程度。 相關性的元素之間需要存在一定的聯系或者概率才可以進行相關性分析。 相關系數在[-1,1]之間。 一、圖示初判 通過pandas做散點矩陣圖進行初步判斷 df1 pd.DataFrame(np.…

leetcode 354. 俄羅斯套娃信封問題(dp+二分)

給定一些標記了寬度和高度的信封&#xff0c;寬度和高度以整數對形式 (w, h) 出現。當另一個信封的寬度和高度都比這個信封大的時候&#xff0c;這個信封就可以放進另一個信封里&#xff0c;如同俄羅斯套娃一樣。 請計算最多能有多少個信封能組成一組“俄羅斯套娃”信封&#…

fastlane use_legacy_build_api true

fastlane版本號&#xff1a;fastlane 1.108.0 Xcode版本號&#xff1a;8.1 MacOS版本號&#xff1a;10.12 使用fastlane打包 - Release / Ad-Hoc包時報錯: [13:36:59]: There was an error exporting your application [13:36:59]: Unfortunately the new Xcode export API is …