合成模式

定义相关

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

举例说明

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,就写这么多。

Top
收藏
关注
评论
原文地址:https://www.cnblogs.com/Joy-et/p/4833972.html