组合(Composite)模式将对象组合成树形结构以表示“部分-整体”的层次结构。这样使得用户对单个对象和组合对象的使用具有一致性。
组合模式,听名字你可能比较陌生,但是你很可能是这种模式的用户,它的应用非常广泛,例如IOS里的UIView、Cocos2d-x里的Node以及Unity3d里的Transform都是典型的组合模式。
本文简单举个例子,假设我们要开发一款机甲类的游戏,机甲由身体、手臂、腿等组件组成,这些部件还可以搭载火箭助推器和激光加农炮等组件,那么我们就可以考虑使用组合模式来设计。
首先定义一个机器组件的抽象类:
public abstract class RobotComponent
{
protected RobotComponent _parent = null;
public virtual RobotComponent parent{
get
{
return _parent;
}
set
{
if (_parent == value) {
return;
}
if (_parent != null)
{
_parent.RemoveComponentFromList (this);
}
_parent = value;
if (_parent != null)
{
_parent.AddComponentToList (this);
}
}
}
public virtual void RemoveFromParent ()
{
parent = null;
}
protected List<RobotComponent> _children = new List<RobotComponent> ();
protected virtual void AddComponentToList(RobotComponent component)
{
if (!CanAddComponent (component)) {
return;
}
if (!_children.Contains (component)) {
_children.Add (component);
}
}
public virtual RobotComponent AddComponent(RobotComponent component)
{
component.parent = this;
return component;
}
public RobotComponent AddComponent<T> () where T : RobotComponent, new()
{
RobotComponent component = new T ();
return AddComponent (component);
}
protected virtual void RemoveComponentFromList (RobotComponent component)
{
if (!_children.Contains (component)) {
return;
}
_children.Remove (component);