设计模式--组合模式

it2024-11-21  19

定义:

将对象组合成树形结构以表示"部分--整体"的层次结构.组合结构使得用户对单个对象和组合对象的使用具有一致性.

关键词:

Composite

结构图:

应用场景:

表达的对象成"整体-部分"层次结构时.

即表达的对象最后结果承树形时,可以采用组合模式.

例如:

中国移动下属3个品牌:全球通,神州行,动感地带.

同时,中国移动下属有北京移动,天津移动,江苏移动等分公司.下属各分公司又包含3个品牌.

各分公司又含有下属单位及相关品牌.

这种树状结构的层次使用组合模式.

实际上,品牌和公司并不是一个类可以描述的,但是为了使客户处理起来方便,可以不分复杂元素和简单元素,也可以使之如此设计.

例子:

类图:

代码: public abstract class Mobile { protected string name; public Mobile(string name) { this.name = name; } public abstract void Add(Mobile m); public abstract void Remove(Mobile m); public abstract void Duty(int depth); } public class Easyown : Mobile { public Easyown(string name) : base(name) { } public override void Add(Mobile m) { } public override void Remove(Mobile m) { } public override void Duty(int depth) { HttpContext.Current.Response.Write(new string('-', depth) + name + "(轻松由我,神州行!)<br/>"); } } public class M_Zone : Mobile { public M_Zone(string name) : base(name) { } public override void Add(Mobile m) { } public override void Remove(Mobile m) { } public override void Duty(int depth) { HttpContext.Current.Response.Write(new string('-', depth) + name + "(我的地盘,听我的!)<br/>"); } } public class GoTone : Mobile { public GoTone(string name) : base(name) { } public override void Add(Mobile m) { } public override void Remove(Mobile m) { } public override void Duty(int depth) { HttpContext.Current.Response.Write(new string('-', depth) + name + "(我能!)<br/>"); } } public class MobileCompany : Mobile { List<Mobile> al = new List<Mobile>(10); public MobileCompany(string name) : base(name) { } public override void Add(Mobile m) { al.Add(m); } public override void Remove(Mobile m) { al.Remove(m); } public override void Duty(int depth) { HttpContext.Current.Response.Write(new string('-', depth) + name + "<br/>"); foreach(Mobile m in al) { m.Duty(depth+2); } } } 页面调用: protected void Page_Load(object sender, EventArgs e) { Mobile m1 = new MobileCompany("中国移动"); m1.Add(new Easyown("神州行")); m1.Add(new M_Zone("动感地带")); m1.Add(new GoTone("全球通")); Mobile m2 = new MobileCompany("江苏移动"); m2.Add(new Easyown("神州行")); m2.Add(new M_Zone("动感地带")); m2.Add(new GoTone("全球通")); Mobile m3 = new MobileCompany("四川移动"); m3.Add(new Easyown("神州行")); m3.Add(new M_Zone("动感地带")); m3.Add(new GoTone("全球通")); Mobile m31 = new MobileCompany("成都移动"); m31.Add(new Easyown("神州行")); m31.Add(new M_Zone("动感地带")); m31.Add(new GoTone("全球通")); m3.Add(m31); m1.Add(m2); m1.Add(m3); m1.Duty(0); } 效果:

转载于:https://www.cnblogs.com/oneword/archive/2009/06/30/1513986.html

最新回复(0)