标签:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。public abstract class Graphics { protected string _name; public Graphics(string name) { this._name = name; } public abstract void Draw(); }
public class Picture : Graphics { public Picture(string name) : base(name) { } public override void Draw() { } public ArrayList GetChilds() { //返回所有的子对象 return new ArrayList(); } }
public class Line : Graphics { public Line(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a " + _name.ToString()); } }
public class Circle : Graphics { public Circle(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a " + _name.ToString()); } }
public class Ractangle : Graphics { public Ractangle(string name) : base(name) { } public override void draw() { Console.WriteLine("Draw a " + _name.ToString()); } }
public abstract class Graphics { protected string _name; public Graphics(string name) { this._name = name; } public abstract void Draw(); public abstract void Add(); public abstract void Remove(); }
public class Picture : Graphics { protected ArrayList picList = new ArrayList(); public Picture(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a" + _name.ToString()); foreach (Graphics g in picList) { g.Draw(); } } public ArrayList GetChilds() { //返回所有的子对象 return new ArrayList(); } public override void Add(Graphics g) { picList.Add(g); } public override void Remove(Graphics g) { picList.Remove(g); } }
public class Line : Graphics { public Line(string name): base(name){ } public override void Draw() { Console.WriteLine("Draw a " + _name.ToString()); } public override void Add() { } public override void Remove() { } }
public class Circle : Graphics { public Circle(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a " + _name.ToString()); } public override void Add() { } public override void Remove() { } }
public class Ractangle : Graphics { public Ractangle(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a " + _name.ToString()); } public override void Add() { } public override void Remove() { } }
1.Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。
2.将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能“应对变化”。
3.Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。ASP.NET控件的实现在这方面为我们提供了一个很好的示范。
4.Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。标签:
原文地址:http://www.cnblogs.com/1285026182YUAN/p/5157352.html