欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Matlab组合模式

程序员文章站 2022-12-24 14:14:34
组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式的目的是让客户端不再区分操作的是组合对象(Composite)还是叶子对象(Leaf),而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象 ......

组合模式(composite),将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式的目的是让客户端不再区分操作的是组合对象(composite)还是叶子对象(leaf),而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样一来,客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。计算机系统的文件夹相当于组合模式的composite,文件相当于组合模式的leaf。本文按照下面的类图,用matlab代码实现组合模式。
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);