设计模式(3)――结构性模式 (六)

2014-11-24 02:43:10 · 作者: · 浏览: 6
HandsetBrandM1();

ab.SetHandsetSoft(new HandsetGame1());
ab.Run();

ab.SetHandsetSoft(new HandsetAddressList());
ab.Run();

Console.Read();

}
}

abstract class HandsetSoft //手机软件
{
public abstract void Run();
}
class HandsetGame1 : HandsetSoft //手机游戏
{
public override void Run()
{
Console.WriteLine("运行手机游戏");
}
}
class HandsetAddressList : HandsetSoft //手机通讯录
{
public override void Run()
{
Console.WriteLine("运行手机通讯录");
}
}

abstract class HandsetBrand1 //手机品牌
{
protected HandsetSoft soft;

//设置手机软件
public void SetHandsetSoft(HandsetSoft soft)
{
this.soft = soft;
}

//运行
public abstract void Run();
}

class HandsetBrandN1 : HandsetBrand1 //手机品牌N
{
public override void Run()
{
soft.Run();
}
}
class HandsetBrandM1 : HandsetBrand1 //手机品牌M
{
public override void Run()
{
soft.Run();
}
}

//新增一个手机MP3播放器软件
class HandsetMP3 : HandsetSoft
{
public override void Run()
{
Console.WriteLine("运行手机MP3播放器");
}
}
//新增手机品牌S
class HandsetBrandS : HandsetBrand1
{
public override void Run()
{
soft.Run();
}
}
}


9. 组合模式

将对象形成树形结构以表示“部分—整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。在需求中体现部分和整体的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式。,组合对象可以不断的递归下去。组合模式让用户可以一致地使用组合结构和单个对象。(就像树——树枝、树叶的关系,树枝就是一个组合对象,树叶是单个对象)


UML图:

\


代码:

view plaincopy to clipboardprint namespace 组合模式
{
class Class1
{
static void Main(string[] args)
{
ConcreateCompany root = new ConcreateCompany("北京总公司");
root.Add(new HRDepartment("总公司人力资源部"));
root.Add(new FinanceDepartment("总公司财务部"));

ConcreateCompany comp = new ConcreateCompany("上海华东分公司");
comp.Add(new HRDepartment("华东分公司人力资源部"));
comp.Add(new FinanceDepartment("华东分公司财务部"));
root.Add(comp );

ConcreateCompany comp1 = new ConcreateCompany("南京办事处");
comp1.Add(new HRDepartment("南京办事处人力资源部"));
comp1.Add(new FinanceDepartment("南京办事处财务部"));
comp.Add(comp1);

ConcreateCompany comp2 = new ConcreateCompany("杭州办事处");
comp2.Add(new HRDepartment("杭州办事处人力资源部"));
comp2.Add(new FinanceDepartment("杭州办事处财务部"));
comp.Add(comp2);

Console.WriteLine("\n结构图:");
root.Display(1);

Console.WriteLine("\n职责");
root.LineOfDuty();

Console.Read();
}
}
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 LineOfDuty(); //履行职责
}

class ConcreateCompany : Company //具体公司类树枝节点
{
private List children = new List()