組合模式(Composite),將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。組合模式的目的是讓客戶端不再區分操作的是組合對象(Composite)還是葉子對象(Leaf),而是以一個統一的方式來操作。實現這個目標的關鍵之處,是設計一個抽象 ...
組合模式(Composite),將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。組合模式的目的是讓客戶端不再區分操作的是組合對象(Composite)還是葉子對象(Leaf),而是以一個統一的方式來操作。實現這個目標的關鍵之處,是設計一個抽象的組件類,讓它可以代表組合對象和葉子對象。這樣一來,客戶端就不用區分到底是組合對象還是葉子對象了,只需要全部當成組件對象進行統一的操作就可以了。電腦系統的文件夾相當於組合模式的Composite,文件相當於組合模式的Leaf。本文按照下麵的類圖,用Matlab代碼實現組合模式。
Component.m
classdef Component < handle & matlab.mixin.Heterogeneous properties(Access = protected) name end methods function obj = Component(name) obj.name = name; end end methods(Abstract) Add(~,~); Remove(~,~); Display(~,~); end methods(Sealed) function res = eq(obj1,obj2) res = eq@handle(obj1,obj2); end function res = ne(obj1,obj2) res = ne@handle(obj1,obj2); end end end
Composite.m
classdef Composite < Component properties(Access = private) children = Component.empty(); end methods function obj = Composite(name) obj = obj@Component(name); end function Add(obj,c) obj.children(end + 1)=c; end function Remove(obj,c) index = [obj.children] ~= c; obj.children = obj.children(index); end function Display(obj,depth) temp = ""; for i = 1:depth temp = temp + "-"; end disp(temp + obj.name); for i = 1:length(obj.children) obj.children(i).Display(depth + 1); end end end end
Leaf.m
classdef Leaf < Component methods function obj = Leaf(name) obj = obj@Component(name); end function Add(~,~) end function Remove(~,~) end function Display(obj,depth) temp = ""; for i = 1:depth temp = temp + "-"; end disp(temp + obj.name); end end end
測試代碼
root = Composite("Composite root"); compX = Composite("Composite X"); root.Add(Leaf("Leaf A")); root.Add(compX); root.Add(Leaf("Leaf B")); compX.Add(Leaf("Leaf XA")); compX.Add(Leaf("Leaf XB")); compXY = Composite("Composite XY"); compX.Add(compXY); leafXYA = Leaf("Leaf XYA"); compXY.Add(leafXYA); compXY.Add(Leaf("Leaf XYB")); compXY.Remove(leafXYA); root.Display(0);