Matlab组合模式
程序员文章站
2022-05-14 12:22:52
组合模式(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);
上一篇: php算开始时间到过期时间的相隔的天数