设计模式
文章平均质量分 66
peter ren
这个作者很懒,什么都没留下…
展开
-
设计模式C++实现:转发器-接收器模式
转发器-接收器(Forwarder-Receiver)设计模式为对等交互模型的软件系统提供了透明进程间通信。它引入转发器和接收器用于从底层的通信机制中分离出对等体。使用条件: 1.系统应该具备通信机制的可交换性。 2.组件合作遵循一种对等模型,在此模型中发送者只需知道其接收器的名字。 3.对等体间的通信不应对系统性能产生主要影响。该模式有三个组件构成:转发器、接收器和对等体。对等体组件负责应用原创 2015-12-11 13:03:01 · 1313 阅读 · 0 评论 -
双检查加锁优化模式
当代码的临界区必须在程序执行期内以线程安全的方式获得一次锁时,双检查加锁优化设计模式能减少争用和同步开销。 例子:class Singleton{public: static Singleton *instance() { if(m_instance == NULL) { m_instance = new Singleto原创 2016-02-18 12:26:14 · 582 阅读 · 0 评论 -
设计模式C++实现:监视器对象
监视器对象设计模式使并发方法的执行同步化,以确保任一时刻仅有一个方法在对象内运行。别名线程安全被动对象。问题场景:应用程序包含被多个线程并发调用的对象。这些方法通常修改其对象的内部状态。为了并发线程内正确执行,有必要对对象的访问进行同步和调度。如果客户机必须显示的获取和释放底层同步机制,如信号、互斥或条件变量。那么并发应用程序更难编程。因此,对象应该负责确保它们需要同步的任何方法被透明的串行化。原创 2016-03-17 20:14:21 · 1525 阅读 · 0 评论 -
半同步/半异步体系结构模式
半同步/半异步体系结构模式将并发系统中的异步和同步处理分离, 简化了编程,同时又没有降低性能。半同步/半异步的结构遵循分层模式,包过四个参与者: 1.同步服务层完成高层处理服务。在独立的操作时可以阻塞线程或进程的运行。 2.异步服务层进行底层的异步处理。处理时不能阻塞。 3.排队层为同步和异步层服务之间提供通信机制。 4.外部事件源产生被异步层接受和处理的事件。 优点: 1.简化和性能。原创 2016-03-22 21:23:30 · 598 阅读 · 0 评论 -
组件配置器
组件配置器设计模式允许应用程序在不必修改、重新编译、静态重新链接应用程序的情况下,在运行时链接和解链它的组件实现。组件配置器进一步支持在不必关闭和重启运行的进程的情况下,把组件配置到不同的应用程序进程。一、解决方案 从组件的实现中分离出组件接口,使应用程序独立于组件实现被配置到应用程序进程的时间点。 二、结构 组件配置器模式有四个参与者: 1.组件。定义一个一致的接口,用于配置和控制组件实现原创 2016-05-12 12:41:43 · 658 阅读 · 0 评论 -
线程特定的存储器
线程特定的存储器设计模式允许多线程使用一个“逻辑上全局的访问点”获取一个局限于某一个线程的对象,而不会导致对象访问中的加锁开销。例如,多线程访问全局errno变量,会导致加锁同步开销。解决方案:为每个具体线程的对象引入一个全局访问点,但是在每个线程的存储器中保存“真实”的对象。应用程序仅通过它们的全局访问点管理这些线程特定对象。 该模式有六个参与者组成。 1.线程特定对象是一个只能有特定线程访问原创 2016-04-20 13:02:33 · 513 阅读 · 0 评论 -
主动器模式
一、定义及问题背景:主动器体系结构模式使事件驱动的应用程序能有效地多路分解和分配由于异步操作的完成而激活的服务请求,这样能获取并发所带来的好处。异步接收和处理多个服务请求的事件驱动的应用程序。通常可以改善分布式系统中的事件驱动应用程序的性能。二、解决方案: 应用服务分成两部分:异步执行的耗时长的操作和在这些操作完成后处理其结果的完成处理程序。三、结构: 包过九个参与者 1.句柄。标识一个操作系原创 2016-05-05 15:21:28 · 623 阅读 · 0 评论 -
资源获取模式:Layz/Eager/Partial Acquisition
lazy acquisition 把资源获取推迟到系统执行可能的最后一刻,以便优化资源使用。 针对场景:具有有限资源且必须满足高要求(高吞吐,高可用)的系统。eager acquisition 模式描述了如何通过在实际使用资源前预先获取并初始化资源来使运行时资源获取具有可预测性和快速性。针对场景:系统获取资源时必须具有高可预测性以及高性能。partial acquisition 模式描述了如何把资源原创 2017-02-08 18:53:11 · 617 阅读 · 0 评论 -
资源管理:caching模式
Caching模式描述了如何通过用完资源后不立即释放资源来避免对资源的昂贵的重新获取。资源会维持他们的标识,并保留在某种可以快速访问的存储器中。它们可以被重用,从而避免了重新获取。时序图:使用caching模式有点: 1.性能提升。 2.可伸缩性。 3.可用性。缓存资源在资源提供者不可用的时候增加了可用性,因为缓存的资源还是可用的。 4.稳定性。减少释放或重新获取的操作,带来稳定性。 缺点原创 2017-02-13 20:20:03 · 669 阅读 · 0 评论 -
lookup模式
lookup模式描述了如何通过使用查找服务作为中介实例,来发现和访问资源(不管资源是本地还是分布式)时序图:1.资源提供者注册资源到lookup服务。 2.资源使用者借助查询服务,通过一个或多个属性来寻找资源。 3.查找服务响应并返回能提供所需资源的资源提供者引用。 4.资源使用者利用资源提供者的引用来获取并访问资源。lookup模式的优点: 1.可获得性。资源使用者可以根据需要查找那些资源原创 2017-01-24 15:29:31 · 791 阅读 · 0 评论 -
c++ 惯用法:定界加锁
定界加锁能确保控制进入到某一范围时,自动获取锁,而当控制离开该范围时,自动释放锁。 代码示例:class Mutex{public: Mutex() { pthread_mutex_init(&_lock, NULL); } virtual ~Mutex() { pthread_mutex_destroy(&_lock);原创 2016-02-17 15:21:14 · 757 阅读 · 0 评论 -
接受器-连接器模式
接受器-连接器模式将网络化系统中的对等体的连接和初始化工作,与该服务在连接和初始化之后所执行的处理分开。 一、结构 接收器-连接器模式有六个关键的参与者: 1.传输端点。如TCP端口号和IP地址。 2.传输句柄。封装传输端点。如一个套接字句柄。 3.服务处理程序。实现网络化应用程序中端到端的服务。 4.接收器。被动地连接和初始化一个相关的服务处理程序。 5.连接器。主动地连接和初始化一原创 2016-02-16 16:20:06 · 761 阅读 · 0 评论 -
设计模式C++实现:管理者模式
动机:为管理一组相关对象的实例化和访问提供统一的接口。管理者使用和扩展单例模式,它们本身就是单例,并且它们可能确保它们管理的对象是唯一的。代码示例:#include <iostream>#include <string>#include <map>using namespace std;class Animal{public: virtual void eat(){cout<<"a原创 2016-02-02 20:06:11 · 3444 阅读 · 1 评论 -
设计模式C++实现:包装器外观模式(Wrapper Facade)
包装器外观模式(Wrapper Facade)把现有的非面向对象的API所提供的函数和数据,封装在更加简洁的、健壮的、可移植的、可维护的和内聚的面向对象的类接口中。 一般通过两种方式实现跨平台: 1.用类似#ifdef宏的条件编译。 2.目录分离。如每个操作系统平台有自己的目录,包含与平台有关的包装器外观的实现。可使用语言处理工具在编译时从相关的目录中包含合适的包装器外观的实现类。 类图如下原创 2015-12-28 11:43:18 · 3547 阅读 · 0 评论 -
设计模式C++实现:客户机-分配器-服务器模式
客户机-分配器-服务器模式,在客户机与服务器间引入一个中间层—分配器组件。借助名字服务实现位置透明性,并且隐藏客户机与服务器间建立通信连接的细节。时序图: 该设计模式优点: 1.服务器的可交换性。 2.位置和迁移的透明行。 3.重新配置。 4.容错性。缺点: 1.由间接方法和显式连接建立而带来的低效率。 2.对分配器组件接口改变的敏感性。 参考《面向模原创 2015-12-14 11:46:24 · 533 阅读 · 0 评论 -
设计模式C++实现:单例模式(Singleton)
一、定义:Ensure a class has only one instance , and provide a global point of access to it.(确保其一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。) 二、类图: 三、代码实例:#include <pthread.h>class Mutex{public: Mutex() {原创 2016-01-19 13:21:17 · 388 阅读 · 0 评论 -
主控-从属模式
主控-从属模式支持容错性、并行计算以及计算准确性。主控组件将工作分配给相同的从属组件并从从属组件返回的结果中计算出最终的结果。 主控-从属模式应用”分而治之“的原则,被广泛应用在并行及分布式计算领域。 时序图: 主控-从属模式有三个应用领域: 1.用于容错的主控-从属。只要至少一个从属能够不失败,就支持容错,客户机就可得到一个有效的结果。 2.用于并行计算的主控-从属。 3.用于计算准确原创 2015-12-03 12:11:06 · 1306 阅读 · 0 评论 -
设计模式C++实现:组合模式
组合模式(Composite Pattern)是部分-整体模式的一种特例,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 类图:适用性 以下情况下适用Composite模式: 1.你想表示对象的部分-整体层次结构 2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象原创 2015-12-03 10:45:37 · 869 阅读 · 0 评论 -
设计模式C++实现:整体-部分设计模式
整体-部分设计模式有助于聚合组件形成一种语义单元。一种聚合组件(整体),封装其构成组件(部分),组织它们之间的协作,并为其功能提供一个公共接口。直接访问一个部分是不可能的。例子: 代码示例:#include <iostream>using namespace std;class wheel{public: wheel() { cout<<"new whe原创 2015-12-02 19:14:41 · 742 阅读 · 0 评论 -
设计模式C++实现:代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。(Provide a surrogate or placeholder for another object to control access to it )代码:#include <iostream>#include <list>#include <string>using namespace std;class ISubject{原创 2015-12-03 17:25:09 · 424 阅读 · 0 评论 -
反应器模式
多路分解并分配从一个或者多个客户机发送给应用的服务请求。 类图如下: 序列图如下: 反应器模式优缺点 优点: 1.事物分离。 2.模块化、可重用性和可配置性。 3.可移植性。 4.粗粒度的并发控制。 缺点: 1.应用范围受到限制。如操作系统不支持 2.非抢先的方式。如果有耗时操作,尽量独立线程处理。 3.调试和测试的复杂性。原创 2016-01-07 19:42:00 · 476 阅读 · 0 评论 -
设计模式C++实现:门面模式
门面模式也叫外观模式。定义如下: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。(Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higer-level interface that makes the subs原创 2015-12-25 18:47:43 · 1004 阅读 · 0 评论 -
资源管理模式:pooling模式
pooling(池)模式描述了如何通过循环使用不再需要的资源来避免昂贵的获取和释放资源的操作。一旦资源被循环利用并置入池中,它们就失去了自己的标识和状态。 场景:连续的获取和释放资源,并且系统满足高可伸缩性和高效率。原创 2017-03-08 11:45:42 · 741 阅读 · 0 评论