zoukankan      html  css  js  c++  java
  • 合成模式

    定义相关

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

    举例说明

    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
    收藏
    关注
    评论
  • 相关阅读:
    数据库模糊查询
    Redis集群简介
    POI导出Excel的三种 workbook的区别
    mysql主从跳过错误
    MySQL server has gone away 问题解决方法
    Redis批量删除key的命令
    Python 3.6学习笔记(一)
    maven项目报错
    使用zabbix监控mysql的三种方式
    postgresql初体验
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4833972.html
Copyright © 2011-2022 走看看