Matlab組合模式(Composite)

組合模式(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);

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章