博客
关于我
设计模式学习笔记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/

你可能感兴趣的文章
Mysql InnoDB 数据更新导致锁表
查看>>
Mysql Innodb 锁机制
查看>>
MySQL InnoDB中意向锁的作用及原理探
查看>>
MySQL InnoDB事务隔离级别与锁机制深入解析
查看>>
Mysql InnoDB存储引擎 —— 数据页
查看>>
Mysql InnoDB存储引擎中的checkpoint技术
查看>>
Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
查看>>
MySQL InnoDB引擎的锁机制详解
查看>>
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
查看>>
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
MySQL Join算法与调优白皮书(二)
查看>>
Mysql order by与limit混用陷阱
查看>>
Mysql order by与limit混用陷阱
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>