您的位置:首页 > 其它

笔记-大话设计模式-19 组合模式

2015-09-09 00:31 369 查看
组合模式(Composite),将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

Demo1:

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 void Display(int depth);
}


class Composite : Component
{
private IList<Component> children = new List<Component>();

public Composite(string name)
: base(name)
{

}

public override void Add(Component c)
{
children.Add(c);
}

public override void Remove(Component c)
{
children.Remove(c);
}

public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
foreach (var component in children)
{
component.Display(depth + 2);
}
}
}


class Leaf : Component
{
public Leaf(string name)
: base(name)
{

}

public override void Add(Component c)
{
throw new NotImplementedException();
}

public override void Remove(Component c)
{
throw new NotImplementedException();
}

public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
}
}


Test:

Composite root = new Composite("root");
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));

Composite firstLevel = new Composite("第一级");
firstLevel.Add(new Leaf("第一级的叶子"));

root.Add(firstLevel);

Composite secondLevel = new Composite("第二级");
secondLevel.Add(new Leaf("第二级的叶子"));

firstLevel.Add(secondLevel);

root.Display(1);




Demo2:

abstract class Company
{
protected string name;

public Company(string name)
{
this.name = name;
}

public abstract void Add(Company c);
public abstract void Remove(Company c);
public abstract void Display(int depth);
public abstract void Dutys();
}


class ConcreteCompany : Company
{
private IList<Company> children = new List<Company>();

public ConcreteCompany(string name)
: base(name)
{

}

public override void Add(Company c)
{
children.Add(c);
}

public override void Remove(Company c)
{
children.Remove(c);
}

public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
foreach (var item in children)
{
item.Display(depth + 2);
}
}

public override void Dutys()
{
foreach (var item in children)
{
item.Dutys();
}
}
}


class ADepartment : Company
{
public ADepartment(string name)
: base(name)
{

}

public override void Add(Company c)
{
throw new NotImplementedException();
}

public override void Remove(Company c)
{
throw new NotImplementedException();
}

public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
}

public override void Dutys()
{
Console.WriteLine("{0} 的ADepartment履行职责", name);
}
}


class BDepartment : Company
{
public BDepartment(string name)
: base(name)
{

}

public override void Add(Company c)
{
throw new NotImplementedException();
}

public override void Remove(Company c)
{
throw new NotImplementedException();
}

public override void Display(int depth)
{
Console.WriteLine(new string('-', depth) + name);
}

public override void Dutys()
{
Console.WriteLine("{0} 的BDepartment履行职责", name);
}
}


Test:

ConcreteCompany root = new ConcreteCompany("北京总公司");
root.Add(new ADepartment("总公司A部门"));
root.Add(new BDepartment("总公司B部门"));

ConcreteCompany branch1 = new ConcreteCompany("华东分公司");
branch1.Add(new ADepartment("分公司的A部门"));
branch1.Add(new BDepartment("分公司的B部门"));

root.Add(branch1);

root.Display(1);

Console.WriteLine(Environment.NewLine);

root.Dutys();


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: