组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 "组合对象" 的含义。
组合模式让你可以优化处理递归或分级数据结构。
组合模式的结构包括Component、Leaf 、Composite 三个部分,其中:
Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
以下情况下适用Composite模式:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
结构图
namespace Libraries.Test.DesignPattern.Composite
{
public abstract class Component
{
protected string _name;
public Component(string name)
{
this._name = name;
}
public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract string Display(int depth);
}
}
namespace Libraries.Test.DesignPattern.Composite
{
public class Composite : Component
{
private List<Component> _children = new List<Component>();
public Composite(string name) : base(name) { }
public override void Add(Component c)
{
_children.Add(c);
}
public override string Display(int depth)
{
string str = new String('-', depth) + _name + "<br/>";
foreach (Component component in _children)
{
str += component.Display(depth + 2);
}
return str;
}
public override void Remove(Component c)
{
_children.Remove(c);
}
}
}
namespace Libraries.Test.DesignPattern.Composite
{
public class Leaf : Component
{
public Leaf(string name) : base(name) { }
public override void Add(Component c)
{
return;
}
public override string Display(int depth)
{
return new String('-', depth) + _name+ "<br/>";
}
public override void Remove(Component c)
{
return;
}
}
}
namespace Libraries.Test.DesignPattern.Composite
{
public class Client
{
public void Excute()
{
Composite composite = new Composite("电脑");
Composite compositeCpu = new Composite("CPU");
compositeCpu.Add(new Leaf("Intel i7"));
compositeCpu.Add(new Leaf("Intel i5"));
Composite compositeMemory = new Composite("内存");
compositeMemory.Add(new Leaf("16G"));
compositeMemory.Add(new Leaf("8G"));
composite.Add(compositeCpu);
composite.Add(compositeMemory);
string str = composite.Display(1)+ "<br/><br/>";
composite.Remove(compositeMemory);
str = composite.Display(1);
}
}
}