定义相关
合成亦可以理解为部分-整体模式。对于一般类型之间的组合、包含引用关系并不是所谓合成。合成模式是指相互之间继承至同样基类或实现统一接口,形成树形关系的一种模式。所谓树形:是指根节点为统一接口或者基类;枝节点包含叶子节点或者是其他枝节点构成复合元素,可以管理其内部的叶子节点,也可以当成叶子节点来操作(因其继承或者实现根节点);叶子节点为简单元素。
举例说明
1、安全合成模式
类型结构图:
其中Word实现IElement接口。ElementComposite定义为抽象类主要是阻止其被创建。
示例代码
/// <summary> /// 字体信息 /// </summary> public class Font { public int Size { get; set; } } public interface IElement { void ChangeFont(Font font); void Display(); void Hide(); } public interface IElementContainer { void Add(IElement element); void Remove(IElement element); void Clear(); } public class Word : IElement { private Font font = new Font() { Size = 10 }; public void ChangeFont(Font font) { this.font = font; } public void Display() { //TODO dispaly the word } public void Hide() { //TODO hide the word } } public abstract class ElementComposite : IElement, IElementContainer { private IList<IElement> elements = null; public IList<IElement> Elements { get { return elements; } } public ElementComposite() { elements = new List<IElement>(); } public virtual void ChangeFont(Font font) { foreach (var item in this.Elements) { item.ChangeFont(font); } } public virtual void Display() { foreach (var item in this.Elements) { item.Display(); } } public virtual void Hide() { foreach (var item in this.Elements) { item.Hide(); } } public virtual void Add(IElement element) { if (!Elements.Contains(element)) { Elements.Add(element); } } public virtual void Remove(IElement element) { elements.Remove(element); } public virtual void Clear() { elements.Clear(); } } public class Setence : ElementComposite { public override void Display() { base.Display(); //TODO display self } public override void Hide() { base.Hide(); //TODO hide self } public override void Add(IElement element) { if (element is Document || element is Paragragh) { throw new ArgumentException("Setence could not add Document or Paragragh!"); } else { base.Add(element); } } } public class Paragragh : ElementComposite { public override void Display() { base.Display(); //TODO display self } public override void Hide() { base.Hide(); //TODO hide self } public override void Add(IElement element) { if (element is Document ) { throw new ArgumentException("Paragragh could not add Document !"); } else { base.Add(element); } } } public class Document : ElementComposite { public override void Add(IElement element) { if (element is Document) { throw new ArgumentException("Document could not add Document !"); } else { base.Add(element); } if (element is Setence || element is Word) { Paragragh p = new Paragragh(); p.Add(element); base.Add(p); } } }
2、透明合成模式
当然透明的一种方式如下:
没能划线....在这仅文字描述下:leaf,CompositeA和CompositeB均继承至IComposite,其中CompositeA和CompositeB中composites为IList<IComposite>.
此为透明的合成模式,实现接口统一,缺点却也显而易见---Leaf也实现了Add,Remove方法,但是其本身却没有元素来管理。
结语
个人觉得安全合成模式更加适合与实现,接口隔离嘛。但这也是要看实际的开发情况而定的
OK,就写这么多。