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

Matlab组合模式的更多相关文章

  1. ComponentPattern (组合模式)

    import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...

  2. 设计模式(十一):从文Finder中认识"组合模式"(Composite Pattern)

    上一篇博客中我们从从电影院中认识了"迭代器模式"(Iterator Pattern),今天我们就从文件系统中来认识一下“组合模式”(Composite Pattern).说到组合模 ...

  3. 设计模式(十)组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  4. 设计模式--组合模式Composite(结构型)

    一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...

  5. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  6. c#设计模式-组合模式

    在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...

  7. C#设计模式系列:组合模式(Composite)

    1.组合模式简介 1.1>.定义 组合模式主要用来处理一类具有“容器特征”的对象——即它们在充当对象的同时,又可以作为容器包含其他多个对象. 1.2>.使用频率 中高 2.组合模式结构图 ...

  8. php实现设计模式之 组合模式

    <?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 * * * 1) 抽象构件角色Co ...

  9. 轻松掌握:JavaScript组合模式

    组合模式 组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一. 基 ...

随机推荐

  1. python 获取天气信息,并绘制曲线

    import urllib.request import gzip import json print('------天气查询------') def get_weather_data() : cit ...

  2. Css3 文字渐变整理(一)

    一.文本颜色渐变 <gradient> :可以应用在所有接受图像的属性上,允许使用简单的语法实现颜色渐变,以便UA在渲染页面自动生成图像. 语法:<gradient> = li ...

  3. SpringBoot(十八):SpringBoot2.1.1引入SwaggerUI工具

    Swagger是一个有用web界面的提供实体模型结构展示,接口展示,调测等的一个工具,使用它可以提高开发者开发效率,特别是前后端配合开发时,大大省去了沟通接口耗费的时间:服务端开发完接口发布后,UI端 ...

  4. Dubbo Filter机制概述

    https://blog.csdn.net/prestigeding/article/details/82085705  从上文可知,在服务的调用或消费端发送请求命令中,Dubbo引入过滤器链机制来实 ...

  5. Transform the vot dataset into 4 corner format

    Transform the vot dataset into 4 corner format Matlab code to change the 8 value ground truth into 4 ...

  6. 【spring源码学习】spring事务中的嵌套事务中的保存点相关知识

    JDBC事务保存点(setSavepoint, releaseSavepoint )实例 以下是使用事务教程中描述的setSavepoint和回滚的代码示例. 此示例代码是基于前面章节中完成的环境和数 ...

  7. ssh scp 上传下载文件

    scp username@servername:/path/filename  例如scp codinglog@192.168.0.101:/home/kimi/test.txt  把192.168. ...

  8. odoo开发笔记 -- 提高访问安全性的一种方式

    场景描述: 最近在做项目的过程中,需要需要将odoo应用集成到其他系统中, 在对方的系统中点击我们的应用,打开对应系统,但是界面不做跳转,在当前页面打开,并且浏览器地址栏只显示IP+应用名,不让显示o ...

  9. .netcore里使用StackExchange.Redis TimeOut 情况解决方法

    在用StackExchange.Redis这个组件时候,时不时会出现异常TimeOut解决方法如下, 解决方法: 在Program的Main入口方法里添加一句话: System.Threading.T ...

  10. Docker网络模式介绍

    一.概述 docker的网络驱动有很多种方式,按照docker官网给出的网络解决方案就有6种,分别是:bridge.host.overlay.macvlan.none.Network plugins, ...