服务访问和配置模式

  1. Wrapper Facade可以将有非对象API提供的函数和数据封装到面向对象的类接口中

     就是把底层API再封装一次,让外部不用关心是调用哪个平台的API,不如锁,在不同的平台上可能是不同的函数,所以直接封装成一个统一的命名
    
     1. 如何根据平台来进行判断封装的函数要调用哪个函数
    1. 使用#ifdef
    2. 使用编译器的设置,把不同的平台实现放在不同的目录,编译的时候自动根据一些平台设置的宏定义去查找对应的目录 优点:
    1. 简洁,内聚,健壮的高级面向对象编程接口
    2. 可移植性和可维护性 缺点:
    1. 功能丧失,每增加一层抽象,都可能丧失访问下一层抽象的功能
    2. 性能降低
    3. 编程语言和编译器的局限性
  2. Component Configure 让应用程序能够在运行阶段加载和卸载组件的实现

     就是程序提供一个虚接口,然后各个子组件去根据这个接口进行开发,就是利用DLL在做插件
    
     优点:
    1. 统一性
    2. 集中管理
    3. 模块化,可测试性和可重用性
    4. 动态的控制和配置
    5. 调整和优化 缺点:
    1. 不确定性及未考虑依赖,一个dll可能花太多时间导致其他dll无法处理事件
    2. 降低安全性和可靠性
    3. 增加了运行时的开销和基础设施的复杂度
  3. Interceptor可以透明地给框架添加服务,并且在特定的事件发生时自动触发他们

     其实就是hook,指定一个接口,然后其他人实现这个接口,像handle注册这个接口,然后事件发生的时候再去回调这个接口,有点类似于qt的 event filter
    
     优点:
    1. 可扩展性和灵活性
    2. 分离关注点
    3. 支持对框架进行监视和控制
    4. 分层对称
    5. 可重用性 缺点:
    1. 复杂的设计问题,预测使用的具体框架的需求不简单,很难判断哪些需要提供分派程序
    2. 恶意或者错误的拦截器
    3. 潜在的连锁拦截
  4. Extension Interface可以避免因开发人员扩展和修改既有组件的服务功能,导致接口膨胀及客户端代码失效

    其实就是COM的这种模式,很丑陋的接口,通过dynamic_cast, 获取IID等来获取对应的V1, V2的类

     优点:
    1. 可扩展性
    2. 分工明确
    3. 支持多态
    4. 组件及其客户端的分离
    5. 支持接口聚合和委托 缺点:
    1. 增加了组件和设计实现的工作量
    2. 增加了客户端编程的复杂度
    3. 额外的间接性和运行时开销

事件处理模式

  1. Reactor, 等待指示事件的发生,分离出事件并且将他们交给复杂处理这些事件的相关事件处理程序

  2. Proactor,在异步处理程序中主动地发起一个或者多个异步请求,然后发送到事件处理程序

     proactor和reactor区别可能就在这里,proactor是其他的线程去处理IO,然后IO发生以后再通知处理线程,而reactor是当前线程去处理IO
  3. Asynchronous Completion Token

     有点类似于信号,发生IO 了后发送信号,只是这个信号是一个接口,接口里面保存了你要处理的一些数据,感觉跟reactor和proactor差不多,可能是我现成的async io框架用多了,感觉没什么实际的东西
  4. Acceptor-Connector

     将SOCKET的句柄传送给其他类进行处理,分派程序只是负责接收句柄

同步模式

  1. scope_lock

     其实就是boost的scope_lock
  2. strategized locking

     在boost里面scopet_lock都需要制定是mutex还是其他mutex,比如boost::scope_lock<boost::mutex>
  3. thread safe interface

     就是 std::unique_lock,不会重复获得锁
  4. double-checked locking

     单件里面一个很经典的问题

并发模式

  1. Active object

     将方法执行和方法调用分离,就是发送一个function到另外一个县城处理
  2. Monitor Object

     单线程调用对象
  3. Half-sync和Half-Async模式

     将系统里面的异步和同步服务处理分离,简化编程,又不降低性能
  4. Leader-followers模式

     多个线程轮流询问事件源,然后对发出的服务进行处理
  5. thread-specific storage

     就是访问thread local对象

<<面向模式的软件架构2-并发和联网对象模式>>读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. Linux Shell 2>&1 &

    转  脚本如: nohup /mnt/Nand3/H2000G >/dev/null 2>&1 & 对 于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就 ...

  2. UE4 Android相对路径转绝对路径方法笔记

    在windows端用FPaths::ConvertRelativePathToFull可以将相对路径转成绝对路径. 在Andoird端,就麻烦些.可模仿UE4源码中AndroidFile.Cpp转换相 ...

  3. 设置vim默认参数 例如设置默认背景颜色

    因个人喜好问题,本人使用vim的时候喜欢将背景颜色设为dark. 但是每次打开一个vim的时候都要重新设置一次,感觉非常麻烦. 总要输入[Esc] :set bg=dark很不方便 粗暴的办法是直接进 ...

  4. C++复数类对除法运算符 / 的重载

    C8-1 复数加减乘除 (100.0/100.0 points) 题目描述 求两个复数的加减乘除. 输入描述 第一行两个double类型数,表示第一个复数的实部虚部 第二行两个double类型数,表示 ...

  5. vs2010无可用源

    全选CPP文件内容,选择 “编辑”-“高级”-“设置选定内容的格式”,保存,重新编译. 当然这种方法是不能完全解决这个问题的奥,你需要在菜单栏的生成里面找到重新生成解决方案,重新生成解决方案试一下啦, ...

  6. Direct3D 10学习笔记(四)——Windows编程

    本篇将简单整理基本的Windows应用程序的实现,并作为创建Direct3D 10应用程序的铺垫.具体内容参照< Introduction to 3D Game Programming with ...

  7. jenkins之安装篇

    自动化学习过程中老师介绍了一个工具jenkins,感觉很不错,学习ingjenkins的war包下载地址http://mirrors.jenkins-ci.org/war/Hudson的war包下载地 ...

  8. day04关于MySqL—Android小白的学习笔记

    Mysql入门 1. 数据库基本知识(了解) 1.1.数据库介绍 1.1.1.什么是数据库?数据库的作用是什么? 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户 ...

  9. Java的数组长度无需编译指定,因为它是对象

    大家可以看从Thinking in Java中摘出来的代码理解一下,甚至.多维数组的子数组无须等长 //: MultiDimArray.java// Creating multidimensional ...

  10. JS对象实现随机满天小星星实例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...