博客
关于我
设计模式学习笔记Composite组合模式
阅读量:713 次
发布时间:2019-03-17

本文共 2308 字,大约阅读时间需要 7 分钟。

composite模式:树形结构下的一种面向对象编程策略,用于将一对多的复杂对象关系转化为一对一的简单对象调用,使客户端代码能够对单个对象与对象组合使用一致接口。这一模式的主要目标是解耦客户代码与对象容器的复杂实现,提高代码的维护性和扩展性。

Composite模式在编程实践中有着广泛的应用场景,其中最常见的一种即是树的逻辑实现。树的结构可以用一类抽象类来表示,其中叶子节点和树枝节点存在本质的不同:叶子节点没有子节点,而树枝节点则可以包含多个子节点。为了保持叶子节点与树枝节点的统一性,我们可以将叶子节点想象成一种没有子节点的特殊树枝节点。这种设计方法使得叶子节点与树枝节点在接口和实现上具有一致性。

在具体实现上,我们可以定义一个抽象类AbstractClass,具有以下核心属性和方法:

  • name:用于存储节点名称
  • list:用于存储子节点
  • Add方法:用于添加子节点
  • Remove方法:用于移除子节点
  • Print方法:用于打印节点信息

其中,树叶节点需要特别处理,其子节点列表可以设为null,避免不必要的方法调用。至于树枝节点,需要实现Add和Remove方法来管理孩子节点的增删变动。

具体实现如下:

Public abstract class AbstractClass {public string name;public ArrayList list;public abstract void Add(AbstractClass item);public abstract void Remove(AbstractClass item);public abstract string Print();}

树枝节点Limb类继承自AbstractClass类,其实现重点在于管理子节点的添加与删除操作:

public class Limb : AbstractClass {public Limb() {list = new ArrayList();}

public override void Add(AbstractClass item) {    list.Add(item);}public override void Remove(AbstractClass item) {    if (list.Contains(item)) {        list.Remove(item);    }}public override string Print() {    Console.WriteLine(name + "\n");    foreach (AbstractClass child in list) {        Console.WriteLine("(Parent is " + name + ")");        child.Print();    }    return name;}

}

叶子节点Leaf类则可以简单地设其子节点列表为null,突破出与树枝节点的统一性:

public class Leaf : AbstractClass {public Leaf() {list = null;}

public override void Add(AbstractClass item) { }public override void Remove(AbstractClass item) { }public override string Print() {    Console.WriteLine(name + ",");    return this.name;}

}

在上述实现中,我们需要注意叶子节点的defaults化处理,使得其不具备与树枝节点相同的Add和Remove方法,避免潜在的运行时错误。

通过上述具体实现,我们可以构建一个树的示例:

public static void Main(string[] args) {//创建树根AbstractClass Tree = new Limb();

//设置节点名称Tree.name = "1";//添加子节点AbstractClass leaf2 = new Leaf();leaf2.name = "2";Tree.Add(leaf2);AbstractClass limb3 = new Limb();limb3.name = "3";Tree.Add(limb3);AbstractClass leaf4 = new Leaf();leaf4.name = "4";limb3.Add(leaf4);AbstractClass leaf5 = new Leaf();leaf5.name = "5";limb3.Add(leaf5);

}

通过这个示例,我们可以看到Composite模式在二维结构的实现中发挥的作用,使得客户端代码能够一致地处理单个节点或节点组合,从而实现了对多层次结构的透明处理。

Composite模式的核心价值体现在三个方面:

其一,通过树形结构实现了一对多关系的透明化,使得客户端代码无需关注对象组合的具体机制。

其二,通过解耦客户代码与对象容器的实现,确保了代码更加灵活和可扩展。

其三,在具体实现中需要权衡Add与Remove方法的定义位置,这关系到对象的透明性和安全性。

在实际应用中,还可以通过缓存机制优化树的遍历性能,提升整体运行效率。

这种设计理念不仅避免了客户代码过多依赖具体的实现细节,也为后续的扩展和维护提供了更为高效的解决方案。

转载地址:http://rblhz.baihongyu.com/

你可能感兴趣的文章
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS UC 2013-0-Prepare Tool
查看>>
msbuild发布web应用程序
查看>>
MSB与LSB
查看>>