您的位置:首页 > 其它

合成模式

2015-09-24 00:02 363 查看

定义相关

合成亦可以理解为部分-整体模式。对于一般类型之间的组合、包含引用关系并不是所谓合成。合成模式是指相互之间继承至同样基类或实现统一接口,形成树形关系的一种模式。所谓树形:是指根节点为统一接口或者基类;枝节点包含叶子节点或者是其他枝节点构成复合元素,可以管理其内部的叶子节点,也可以当成叶子节点来操作(因其继承或者实现根节点);叶子节点为简单元素。

举例说明

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,就写这么多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: