组合模式是设计中非常重要的一个模式,下面是我对组合模式的一个简单总结。
名字:
组合模式
定义:
将对象组合成树状结构以表示‘部分-整体’的结构层次。组合模式使得用户对单个对象和组合对象的使用具有一致性。
类图:
优点:
一、 定义了组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,不断的递归下去,客户端代码中,任何用到基本对象的地方都可以使用组合对象
二、 用户不用关心是处理一个叶节点还是处理一个组合组件,用不着为定义组合写选择判断语句,也就是说组合模式让客户一致地使用组合结构和单个对象。
缺点:
一、 使用组合模式后,控制树枝构件的类型不太容易
二、 用继承的方法来增加新的行为很困难
何时用?
一、 需求中是体系那部分与整体层次结构时;
二、 希望用户可以忽略单个对象的不同,统一的手工组合结构中的所有对象时
代码实现:
抽象类或接口
<span style="font-size:18px;">//抽象类或接口
abstract class Company
{
protected string name;
public Company(string name)
{
this.name = name;
}
public abstract void add(Company c);
public abstract void display(int depth);
}
</span>
树枝节点:
<span style="font-size:18px;">//树枝节点
class ConcreteCompany : Company
{
private List<Company> children = new List<Company>();
public ConcreteCompany(string name)
: base(name)
{ }
public override void add(Company c)
{
children.Add(c);
}
//显示
public override void display(int depth)
{
Console.WriteLine (new string ('-',depth)+ name)
foreach (Company component in children)
{
component.display (depth + 2);
}
}
}
</span>
树叶节点:
<span style="font-size:18px;">//叶节点
class HRdepartment : Company
{
public HRdepartment(string name)
: base(name)
{ }
public override void add(Company c)
{ }
//显示
public override void display(int depth)
{
Console.WriteLine (new string ('-',depth )+ name)
}
}
</span>
尤为注意的是不要忽略了树枝节点与树叶节点的区别。
备注:
透明方式:在公司抽象类中声明所有用来管理子对象的方法,这样实现公司接口的所有子类都具备了add和remove
好处:叶节点和枝节点对于外界没有区别,且具备一直的行为接口。
缺点:叶节点类本身不具备add()、remove()的方法功能,实现它没有意义。
安全方式:在公司抽象类中不去声明add和remove方法,子类的叶节点也就不需要去实现它,而是在枝节点声明所有管理子类对象的方法。
优点:避免了透明方式存在的问题。
缺点:由于不够透明,所有树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,非常不方便。