//抽象组件基类 public abstract class Component { public int level; public string name; public Component(string n,int l=0) { level = l; name = n; } public abstract void Add(Component cc); public abstract void Remove(Component cc); public abstract void Do(); }
//容器类 using System.Collections.Generic; using UnityEngine; public class Composite : Component { private List<Component> list = new List<Component>(); public Composite(string n) : base(n) { } public override void Add(Component cc) { cc.level = this.level + 1; list.Add(cc); } public override void Do() { Debug.Log("层次" + level + ":" + name); foreach (Component c in list) { c.Do(); } } public override void Remove(Component cc) { list.Remove(cc); } }
//叶子类 using UnityEngine; public class Leaf : Component { public Leaf(string n) : base(n) { } public override void Add(Component cc) { Debug.Log("叶节点无法添加组件"); } public override void Do() { Debug.Log("层次" + level + ":" + name); } public override void Remove(Component cc) { Debug.Log("叶节点无法移除组件"); } }
//测试使用 using UnityEngine; public class testComposite : MonoBehaviour { void Start () { Component root = new Composite("root"); Leaf leaf = new Leaf("leaf1"); root.Add(leaf); Composite com = new Composite("com1"); root.Add(com); Leaf leaf2 = new Leaf("leaf2"); com.Add(leaf2); root.Do(); } }
组合模式其实就是构建一颗树,这里实现统一化让叶子节点和容易都有一样的方法,让小东西组合成大的东西,Do方法遍历层次输出结果,这里用的是先序遍历。