ESFramework 4.0 进阶(02)-- 核心:消息处理的骨架流程一文中我们介绍的ESFramework提供的消息处理的骨架流程,假设我们有这样的需求,我们需要在网关级消息监控器处放置两个监控器,一个用于对收到的消息进行特殊的验证,另一个用于检查重复的消息。咋一看,可能觉得骨架流程做不到这一点,因为它只为网关级监控器预留了一个位置,没有办法将两个网关级监控器挂接到这一个位置上。
      ESFramework通过Composite模式解决了这个问题。Composite模式允许将实现了同一接口的多个组件放在一个容器中,而这个容器也实现了相同的接口。如此,我们可以使用这个容器组件来挂接到只接受单个组件的扩展点。在ESFramework中,将这种容器组件称为ContainerStyle组件。下图是使用Composite模式组合IMessageSpy组件而得到ContainerStyleMessageSpy组件的类图。

ContainerStyleMessageSpy的实现也很简单,代码如下所示:

    public sealed class ContainerStyleMessageSpy : IMessageSpy
    {
        #region SpyList
        private IList<IMessageSpy> spyList = new List<IMessageSpy>();
        public IList<IMessageSpy> SpyList
        {
            set
            {
                spyList = value ?? new List<IMessageSpy>();
            }
        }
        #endregion

#region IMessageSpy 成员

#region Enabled
        private bool enabled = true;
        public bool Enabled
        {
            set { this.enabled = value; }
            get { return this.enabled; }
        }
        #endregion

#region SpyMessageReceived
        public bool SpyMessageReceived(IMessage msg)
        {
            if (!this.enabled)
            {
                return true;
            }

foreach (IMessageSpy spy in this.spyList)
            {
                bool keepOn = spy.SpyMessageReceived(msg);
                if (!keepOn)
                {
                    return false;
                }
            }

return true;
        }
        #endregion

#region SpyMessageToBeSent
        public bool SpyMessageToBeSent(IMessage msg)
        {
            if (!this.enabled)
            {
                return true;
            }

foreach (IMessageSpy spy in this.spyList)
            {
                bool keepOn = spy.SpyMessageToBeSent(msg);
                if (!keepOn)
                {
                    return false;
                }
            }

return true;
        }
        #endregion

#endregion
    }

对于上面的例子,我们可以将用于消息验证的监控器和检查重复消息的监控器放到一个ContainerStyle风格的网关级监控器组件ContainerStyleMessageSpy中,然后再将这个ContainerStyleMessageSpy组件挂接到消息流程骨架中对应的扩展点处。
      对于消息监控器IMessageSpy、消息过滤器IMessageFilter、消息处理器IMessageProcesser等等,ESFramework都提供了对应的ContainerStyle组件实现,这些组件的名称都以“ContainerStyle”开头。当我们需要将同一类型的多个消息组件组装成一个整体时,可以直接使用这些ContainerStyle组件来进行组装。

关于在设计开发中要不要使用设计模式、使用何种设计模式,其实很多时候都是自然而然水到渠成的事情,并不是要刻意将模式硬搬到我们的项目中。有些时候,不经意间,你也许已经不自觉地使用了某个经典模式,或创造了某个模式。

应用Composite模式相关推荐

  1. 结构型模式之Composite模式

    1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.适用性 以下情况使用Composite模式 (1 ...

  2. 设计模式之组合模式(Composite 模式)

    引入composite模式 在计算机文件系统中,有文件夹的概念,文件夹里面既可以放入文件也可以放入文件夹,但是文件中却不能放入任何东西.文件夹和文件构成了一种递归结构和容器结构. 虽然文件夹和文件是不 ...

  3. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...

  4. 设计模式学习笔记——组合(Composite)模式

    设计模式学习笔记--组合(Composite)模式 @(设计模式)[设计模式, 组合模式, composite] 设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Ent ...

  5. 设计模式---组合Composite模式

    1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 在绘图编辑器和图形捕捉系统这样的图形应用程 ...

  6. 组合(Composite)模式

    定义 Composite模式是一种结构型设计模式,它将对象组合成树形结构以表示"部分-整体"的层次结构,并使用户对单个对象和组合对象的使用具有一致性. 动机 当处理树形结构的数据时 ...

  7. 合成(composite)模式

    合成模式属于对象的结构模式,有时又叫做"部分--整体"模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式 ...

  8. 设计模式之Composite模式(笔记)

    组合模式:将对象组合成树形结构以表示"部分-总体"的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 适用场合:当需求中是体现部分与总体层次的结构时,以及希望用户 ...

  9. 八、结构模式之组合(Composite)模式

    组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...

  10. Java与模式学习笔记 —— 合成(Composite)模式

    合成模型模式属于对象的结构模式,又称作部分-整体(Part-Whole)模式.合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 一.树结构 ...

最新文章

  1. 云计算中心的实施技术
  2. Create React App使用
  3. 匿名对象和object的转换
  4. 《HTML5 canvas开发详解(第2版)》——1.3 本书使用的基础HTML页面
  5. MATLAB矩阵复制数据
  6. LiteOS内核源码分析:消息队列Queue
  7. 交付量强劲增长 特斯拉营收却将出现7年来首次下滑
  8. 对计算机的硬盘进行高级格式化,牛刀初试 高级格式化硬盘完全体验
  9. 想创业怕失败就不要轻易选择去创业
  10. SQL_drop删除表、数据库
  11. openssl构建CA认证
  12. 一篇好奇心文,带你看懂基金的运营全貌
  13. 什么是激励函数?(代码+详细注释)
  14. 地缘剧本杀 (十一):疗伤(原创小说连载,内含语音)
  15. 心电信号越界怎么回事_一种心电信号处理方法
  16. springboot 整合redis配置文件
  17. 根据人脸关键点做人脸对齐face alignment----C++实现
  18. 设计原则-依赖倒置原则
  19. STM32与ST-Link杜邦线连接
  20. 头条视频中视频玩法技巧

热门文章

  1. 莫比乌斯反演汇总【算法+题目】
  2. mac储存文件应该放在哪里_单位不能存档,个人档案应该放在哪里呢,影响今后退休金吗?...
  3. 02 Oracle 批量导出建表语句和数据
  4. IdentityServer4 中文文档与实战
  5. W,b的初始化和几种激活函数
  6. Linux入门——开机启动过程浅析
  7. [JSOI2008]最大数maxnumber(线段树)
  8. 一线城市房价下跌 机构称年内限购难放松
  9. Hibernate读书笔记-----事件机制
  10. SQL*Plus和iSQL*Plus的区别(oracle)