Gof对于组合模式的定义是:
“将对象以树状结构组合,用以表现部分-全体的层次关系。组合模式让客户端在操作各个对象或者组合对象时是一致的。”
Gof的组合模式中说明,它使用“树状结构”来组合各个对象,所以实现时也包含了“根节点”与“叶节点”的概念。而“根节点”中野会包含“叶节点”的对象,所以当根节点被删除时,叶节点也会被一起删除,并且希望对于“根节点”和“叶节点”在操作方法上能够一致。这表示,这两种节点都是继承自同一个操作界面,能够对根节点调用的操作,同样能够在叶节点上使用。
结构图如下:
GOF的参与者说明如下:
Compoent(组件界面):定义树状结构中每一个结构可以使用的方法。
Composite(组合节点):根节点、父节点;包含叶节点,会实现Compoent里面的方法。
Leaf(叶节点):不再包含任何子节点的最终节点;实现Compoent(组件界面)的方法,与子节点有关可以不实现,也可以报警告。
这样看起来是不是有点像unity里面的代码:transform.Getcompent<T>()....
这种类似的,因为unity正是采用这种方法布局整个场景的。场景树就是以transform为基础搭建的,你可以发现每一个节点都有一个transform。
组合模式的实现范例:
public abstract class ICompoent
{
protected string m_Value;
//一般操作
public abstract void Operation();
//加入节点
public virtual void Add(ICompoent theCompoent)
{
Console.WriteLine("子类没实现");
}
//移除节点
public virtual void Remove(ICompoent theCompoent)
{
Console.WriteLine("子类没实现");
}
public virtual ICompoent GetChild(int index)
{
Console.WriteLine("子类没实现");
return null;
}
}
public class Composite:ICompoent
{
List<ICompoent> m_childs = new List<ICompoent>();
public Composite(string value)
{
m_Value = value;
}
//一般操作
public override void Operation()
{
Console.WriteLine("Composite[" + m_Value+"]");
foreach(ICompoent compoent in m_childs)
{
compoent.Operation();
}
}
//加入节点
public override void Add(ICompoent theCompoent)
{
m_childs.Add(theCompoent);
}
//删除节点
public override void Remove(ICompoent theCompoent)
{
m_childs.Remove(theCompoent);
}
//获取子节点
public override ICompoent GetChild(int index)
{
return m_childs[index];
}
}
public class Leaf : ICompoent
{
public Leaf(string value)
{
m_Value = value;
}
public override void Operation()
{
Console.WriteLine("Leaf[" + m_Value + "]执行opreation()");
}
}
然后就是按照上面这三个类进行创建根节点、父节点、叶节点,然后进行操作测试。
最后说一点,这个模式多半是用于界面设计的,因为玩家是通过ui界面与游戏系统进行交互的,而这些界面其实就是可以看做一个层级关系,最经典的操作就是“红点系统”的设计,充分的利用了树状结构、部分与整体的关系,大家有兴趣可找找。
以上就是本周的读书笔记。