Unity【话大】设计模式之组合模式
2019-01-28 本文已影响43人
su9257_海澜
前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了。
在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略。
有说的不正确或者不准确的地方欢迎留言指正
有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力
今天跟大家介绍一下组合模式,这种模式笔者理解为递归调用的扩展。
组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
示例相对简单,其实就是一个树状的结构,有一个主干,然后就是分支,每个分支可能是叶子节点,也可能是含有子分支的节点。下面笔者就直接展示相关的示例代码了
首先我们先创建一个几点的抽象基类 ,也就是每个节点基类
public abstract class CompsiteBase
{
protected string name;
public CompsiteBase(string name)
{
this.name = name;
}
public abstract void Add(CompsiteBase c);
public abstract void Remove(CompsiteBase c);
public abstract void Display(int depth);
}
叶子节点,也就是不含子节点的分支
public class Leaf : CompsiteBase
{
public Leaf(string name)
: base(name)
{ }
public override void Add(CompsiteBase c)
{
this.Log("Cannot add to a leaf");
}
public override void Remove(CompsiteBase c)
{
this.Log("Cannot remove from a leaf");
}
public override void Display(int depth)
{
this.Log(new String('-', depth) + name);
}
}
含有子节点的分支
public class Composite : CompsiteBase
{
private List<CompsiteBase> children = new List<CompsiteBase>();
public Composite(string name)
: base(name)
{ }
public override void Add(CompsiteBase c)
{
children.Add(c);
}
public override void Remove(CompsiteBase c)
{
children.Remove(c);
}
public override void Display(int depth)
{
this.Log(new String('-', depth) + name);
foreach (CompsiteBase compsite in children)
{
compsite.Display(depth + 2);
}
}
}
示例调用
void Start()
{
Composite root = new Composite("root");
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));
Composite comp = new Composite("Composite X");
comp.Add(new Leaf("Leaf XA"));
comp.Add(new Leaf("Leaf XB"));
root.Add(comp);
Composite comp2 = new Composite("Composite XY");
comp2.Add(new Leaf("Leaf XYA"));
comp2.Add(new Leaf("Leaf XYB"));
comp.Add(comp2);
root.Add(new Leaf("Leaf C"));
Leaf leaf = new Leaf("Leaf D");
root.Add(leaf);
root.Remove(leaf);
root.Display(1);
}
组合模式也分为透明模式和安全模式
-
安全模式,在抽象基类中没有提供
Add
Remove
等管理子节点的方法,优点:就是不必实现不需要的相关函数,缺点:就是需要区分叶子节点和含有子节点的分支,进行分别调用 - 透明模式 与安全模式相反,含有对应管理子节点的函数,优点可以统一的调用,缺点容易错误调用先关的管理函数引发异常
当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽律组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。