Matlab组合模式

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

相关推荐

  • 手摸手带你理解Vue的Watch原理

    前言 watch 是由用户定义的数据监听,当监听的属性发生改变就会触发回调,这项配置在业务中是很常用.在面试时,也是必问知识点,一般会用作和 computed 进行比较. 那么本文就来带大家从源码理解 ...

  • 干货|图解 Vue 响应式原理

    Vue 初始化 模板渲染 组件渲染 本文 Vue 源码版本:2.6.11,为了便于理解,均有所删减. 本文将从以下两个方面进行探索: 从 Vue 初始化,到首次渲染生成 DOM 的流程. 从 Vue ...

  • Composite组合模式

    >>返回<C#常用设计模式> 1. 简介 2. 示例 3. 适用环境 1. 简介 定义 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构. 组合模式让调用程序可以统一 ...

  • 再谈多功能机器、组合机器与多用途机器的关系

    喜 迎 元 旦 多功能机器(multi-function machine)与组合机器(composite machine)的归类方法由第十六类注释三与总注释第六款给出,前者在类注中被描述为" ...

  • 这几种前端JavaScript方法封装你知道多少

    这几种前端JavaScript方法封装你知道多少

  • PHP设计模式之组合模式

    PHP设计模式之组合模式 互联网公司流行扁平化管理,也就是管理层级尽量少于或者不超过三层,作为一个底层的码农,你的CEO和你的职级也就相差3层以内.但是很多传统企业,则会有非常深的层级关系,从数据结构 ...

  • 一个不确定内容的数组,统计每个元素出现的次数的方法

    第一种方法使用reduce方法,通过传入的内容来确定 var arrs=['a','a','d','c','f','d','我','我','他',2,2,5,4,6,8]; function a(){ ...

  • C#设计模式-组合模式(Composite Pattern)

    概念 组合是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们. 组合模式(Composite Pattern)是将对象组合成树形结构以表示'部分-整体'的层次 ...

  • 设计模式(十)——组合模式(HashMap源码解析)

    设计模式(十)——组合模式(HashMap源码解析)

  • 结构型模式之组合模式

    在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等. 在软件开发中也 ...