设计模式
文章平均质量分 81
个人笔记
物随心转
子曰:“学而时习之,不亦说乎?”
展开
-
软件架构之事件驱动架构
事件驱动的架构是围绕事件的发布、捕获、处理和存储(或持久化)而构建的集成模型。某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时,就会发布一个事件(也就是对该操作或更改的记录),另一个应用或服务便可以获取和处理该事件,继而执行更多操作。原创 2024-01-10 20:31:58 · 950 阅读 · 1 评论 -
软件设计方法——领域驱动设计(DDD)
要做到这一点,离不开团队各个角色的沟通与协作。(2)值对象(Value Object):一个没有概念上标识符描述一个领域方面的对象,这些对象是用来表示临时的事物,或者可以认为值对象是实体的属性,这些属性没有特性标识但同时表达了领域中某类含义的概念。(6)仓储(Repository):是用来管理实体的集合,仓储里面存放的对象一定是聚合,原因是domain是以聚合的概念来划分边界的;(2)核心子域(Core Domain):子领域中最核心的叫核心子域,团队的核心资源应该用在核心子域上,因为它是产品成败的关键。原创 2023-12-03 21:15:47 · 2375 阅读 · 1 评论 -
软件理论——演进式架构设计
与传统的瀑布式设计方法相比,演进式设计更加灵活和可适应。在瀑布式设计中,设计通常是在项目的早期阶段完成的,并且需要经过大量的计划和准备。但是,在演进式设计中,设计和开发是相互交织的,随着需求的变化,设计也随之变化。通过演进式设计,开发人员可以更快地响应变化的需求,同时也可以更好地控制开发成本。1. 恰到好处的设计:根据当前需求进行必要的设计,但不必过度设计。3. 识别和重构疏漏:在迭代过程中识别和重构设计中的疏漏或错误。2. 逐渐迭代:在项目的不同阶段,逐步改进设计。原创 2023-12-03 20:54:50 · 742 阅读 · 0 评论 -
软件设计开发技术的演进
1966 过程化编程:取消goto,结构化编程,流程图建模,软件 = 算法 + 数据结构。2010+ 编程语言的演进: C++11,java8,Go,异步与并发,安全性。1995 4+1视图:场景视图,逻辑视图,开发视图,运行视图,物理视图。2007 MBSE SysML:建模语言,建模工具,建模方法,形式验证。2001 敏捷开发:TDD,重构,持续继承,代码表达力,演进式设计。1997 UML:用例图,静态图,行为图,交互图,实现图。1980+ 面向对象编程: C++,逻辑复用,抽象接口。原创 2023-11-22 21:05:04 · 282 阅读 · 0 评论 -
从业务到软件架构——软件建模
1)泛化: 指的是类之间的继承或者实现关系,继承使用空心三角箭头+实线表示[<|--],实现使用空心三角箭头+虚线表示[<|..],生命周期:在定义类关系时就必须确定,一开始有效。5)依赖:表示一个类需要依赖另一个类做方法的返回值、形参、局部变量或者调用另外一个类方法的依赖关系,使用箭头+虚线表示[..>],生命周期:在类的函数调用时有效。行为事物(交互、状态机);3)详细设计:使用逻辑视图(类图、对象图)和行为视图(状态图、活动图、合作图、顺序图),去描述实现系统的静态结构和动态结构方案。原创 2023-11-08 21:49:12 · 161 阅读 · 0 评论 -
软件开发的复杂性与效能提升
模糊性产生了最直接的复杂度,让我们很难读懂代码真正想表达的含义,无法读懂这些代码,也就意味着我们更难去改变它。而依赖性又导致了复杂性不断传递,不断外溢的复杂性最终导致系统的无限腐化,一旦代码变成意大利面条,几乎不可能修复,成本将成指数倍增长。毫无疑问,我们没有足够的时间完全理解它,但是我们一定要找到那个见鬼的合适地方以加入我们的修改。2、在每次迭代中,尽量设计通用性的接口,花一定的时间修改或调整系统设计,让后期迭代更加顺畅。1、编写合适的软件文档,在系统的早期就尽可能的降低问题复杂度,使系统逐渐明朗。原创 2023-03-20 21:43:15 · 584 阅读 · 0 评论 -
设计模式之建造者模式
一、背景在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由 CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。生活中这样的例子很多,如游戏中的不同角色,其性别、个性、能力、脸型、体型、服装、发型等特性都有所差异;还有汽车中的方向盘、发动机、车架、轮胎等部件也多种多样;每封电子邮件原创 2021-09-24 08:42:21 · 123 阅读 · 0 评论 -
设计模式之状态模式
一、背景状态这个词汇我们并不陌生,在日常生活中,不同时间就有不同的状态,早上起来精神饱满,中文想睡觉,下午又渐渐恢复,晚上可能精神更旺也可能耗费体力只想睡觉,这一天中就对应着不同的状态。二、定义状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。2.1. 模式的结构状态模式包含以下主要角色。环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换原创 2021-09-04 11:40:41 · 523 阅读 · 0 评论 -
设计模式之解释器模式
一、背景解释器这个名词想必大家都不会陌生,比如编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法分析树。诸如此类的例子也有很多,比如编译器、正则表达式等等。二、定义解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。2.1 模式的结构原创 2021-09-04 11:15:18 · 120 阅读 · 0 评论 -
设计模式之备忘录模式
一、背景二、定义原创 2021-08-29 22:54:08 · 137 阅读 · 0 评论 -
设计模式之访问者模式
一、背景在现实生活中,有些集合对象存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。...原创 2021-08-22 23:03:10 · 135 阅读 · 0 评论 -
设计模式之责任链模式
一、背景现实中,请假的OA申请,请假天数如果是半天到1天,可能直接主管批准即可;如果是1到3天的假期,需要部门经理批准;如果是3天到30天,则需要总经理审批;大于30天,正常不会批准。在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常二、定义责任链(Chain of Responsibility Pattern),顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多原创 2021-08-16 23:08:59 · 280 阅读 · 0 评论 -
设计模式之享元模式
一、背景在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景二、定义参考:http://c.biancheng.net/view/1371.html...原创 2021-08-15 22:13:40 · 123 阅读 · 0 评论 -
设计模式之命令模式
一、背景在现实生活中,命令模式的例子很有很多。比如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。在软件开发系统中,“方法的请求者”与“方法的实现者”之间经常存在紧密的耦合关系,这不利于软件功能的扩展与维护。例如,想对方法进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与实现者解耦?”变得很重要,命令模式就能很好地解决这个问题。...原创 2021-08-12 23:04:29 · 186 阅读 · 0 评论 -
设计模式之原型模式
一、背景在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。二、定义原型模式是简单程度仅次于单例模式的简单模式,它的定义可以简单理解为对象的拷贝,通过拷贝的方式创建一个已有对象的新对象,这就是原型模式。2.1模式的结构原型模式包含以下主要角色。抽象原型类:规定了具体原型对象必须实现的接口。 具体原型类:实现抽象原型类的 clone() 方法,它是可被复原创 2021-08-12 08:45:06 · 99 阅读 · 0 评论 -
面向对象设计原则——迪米特法则
typedef std:map<int, CString> UDT_MAP_INT_CSTRING;//定义UDT_MAP_INT_CSTRING enumMap;如此map对象就定义好了,增加,改变map中的条目非常简单,因为map类已经对[]操作符进行了重载,代码如下:enumMap[1] = "One";enumMap[2] = "Two";.....或者ins...原创 2019-09-17 09:25:36 · 215 阅读 · 0 评论 -
面向对象设计原则——依赖倒置原则
一、定义依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向原创 2020-08-25 22:01:48 · 257 阅读 · 0 评论 -
设计模式之外观模式
一、模式背景在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。图 1 给出了客户去当地房产局办理房产证过户要遇到的相关部门。软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。二、外观模转载 2020-10-19 22:34:20 · 166 阅读 · 0 评论 -
适配器模式和代理模式的区别
一、简介 适配器模式:适配器模式(英语:adapter pattern)有时候也称包装样式或者包装。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。 代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。二、问题设计模式总是通过增加中介层来进行解耦合,提高扩展性,但是如果我...转载 2020-10-14 11:26:31 · 2890 阅读 · 0 评论 -
设计模式之代理模式
一、代理模式的背景在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。二、代理模式的定义与特点代理模式的定义:由于某些原原创 2020-10-14 11:20:29 · 196 阅读 · 0 评论 -
设计模式之适配器模式
一、适配器模式的背景在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题二、模式的定义与特点适配器模式(Adapter)转载 2020-10-14 10:57:42 · 118 阅读 · 0 评论 -
设计模式之桥接模式(Bridge模式)
一、模式动机设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案: •第一种设计方案是为每一种形状都提供一套各种颜色的版本。 •第二种设计方案是根据实际需要对形状和颜色进行组合。对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间...原创 2020-10-13 11:27:59 · 763 阅读 · 0 评论 -
设计模式之抽象工厂模式
一、定义前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,图 1 所示的是海尔工厂原创 2020-09-23 21:12:45 · 299 阅读 · 0 评论 -
设计模式之工厂方法模式
一、定义在上一节中,我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而工厂方法模式(Factory Method),又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。应用场景:客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。 创建对象的任务由多个具体子工厂中的某一个完成,而抽象原创 2020-09-20 10:40:37 · 128 阅读 · 0 评论 -
设计模式之简单工厂模式
一、背景现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。我们的项目代码同样是由简到繁一步一步迭代而来的,但对于调用者来说,却越来越简单。在日常开发中,凡是需要生成复杂对象的地方,都可以尝试考虑使用工厂模式来代替二、定义我么定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。按实际业务场景划分,工厂模式有原创 2020-09-19 10:09:07 · 222 阅读 · 0 评论 -
设计模式之组合模式
在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。一、定义组合(Composite)模式的定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。转载 2020-09-17 21:58:01 · 265 阅读 · 0 评论 -
设计模式之单例模式
双重检查锁定模式(DCLP)Singleton* Singleton::getInstance() { if (pInstance == nullptr) { // 第一次检查 Lock lock; if (pInstance == nullptr) { // 第二次检查 pInst...转载 2020-04-10 14:28:15 · 185 阅读 · 0 评论 -
设计模式之中介者模式(mediator)
一、定义中介者模式, 当多个类彼此关联, 会增大耦合性, 这时各个模块通过中介者进行交流, 每个模块只负责自己的业务逻辑, 不属于自己的就丢给中介者, 降低耦合。在生活中,例如,你刚刚参力口工作想租房,可以找“房屋中介”;或者,自己刚刚到一个陌生城市找工作,可以找“人才交流中心”帮忙。这都是中介二、模式的结构与实现中介者模式实现的关键是找出“中介者”,下面对它的结构和实现进行分析。1. 模式的结构中介者模式包含以下主要角色。抽象中介者(Mediator)角色:它是中介者的接口,提转载 2020-08-24 22:37:15 · 155 阅读 · 0 评论 -
设计模式之迭代器模式
主要结构如图所示,最重要的是getIterator方法, public Iterator getIterator() { return(new ConcreteIterator(list)); }请移步http://c.biancheng.net/view/1395.html...转载 2019-11-29 11:27:24 · 159 阅读 · 0 评论 -
设计模式之策略模式
一、背景在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。如果使用多重条件转移语句实现(if else if),不但使条件语句变得很复杂,而且增加、删除或更换算法要修改原代码,不易维护,原创 2020-08-25 22:39:46 · 166 阅读 · 0 评论 -
设计模式之装饰模式
在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。一、装饰模式的定义与特点装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。装饰(Decorator)模式的主要优点有:采用装饰模式扩展对象的功能比采用继承方式原创 2020-09-09 22:52:09 · 283 阅读 · 0 评论 -
设计模式之观察者模式
在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、气象局的天气预报与听众、小偷与警察等。一、定义观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视转载 2020-09-10 21:57:32 · 168 阅读 · 0 评论