![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
design pattern
青盏
这个作者很懒,什么都没留下…
展开
-
敏捷开发之原则 五大原则 SRP OCP LSP DIP ISP
一、面向对象设计原则内容来自《敏捷开发:原则、模式与实例》 SRP单一职责原则(Single Responsibility Principle): 就一个类而言,应该仅有一个引起它变化的原因。 OCP开放-封闭原则(Open Closure Principle): 软件实体(类,模块,函数等)应该可以扩展的,但不可修改。 LSPLiskov 替换原则(Liskov Substitution原创 2017-02-08 22:04:57 · 15492 阅读 · 4 评论 -
行为型模式之状态STATE
一、意图在一个对象的状态改变时,改变其行为。二、图解 TCPConnect维护一个TCP当前状态对象,如果TCP状态改变,Connect对象就改变当前使用的状态对象。三、结构原创 2017-03-09 23:04:16 · 247 阅读 · 0 评论 -
行为型模式之策略STRATEGY
一、意图一种功能对应多种算法,可以将其一个个封装起来,相互间可以替换,使其独立于客户而变化。二、图解三、结构原创 2017-03-10 10:18:03 · 252 阅读 · 0 评论 -
创建型模式之工厂方法FACTORY METHOD
意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。我将工厂模式分为三个部分:原料、工厂、购买者一、原料 一般情况下我们的原料属于同种。比如说面积:有圆面积,矩形面积,正方形面积等。这些都属于面积的算法。但是他们具体到某个详细算法时又有所不同,所以我们可以用多个子类继承同一个基类。由于基类不属于某个具体形状。所以它应该定义成抽象类原创 2016-12-31 14:18:06 · 512 阅读 · 0 评论 -
创建型模式之抽象工厂ABSTRACT FACTORY
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。一、工厂模式与抽象工厂模式区别工厂模式抽象工厂模式与工厂模式类似。不过处理的问题更为复杂。工厂模式中我们处理的是不同图形的面积,而在抽象工厂模式中我们添加了不同图形的体积计算。如果我们单考虑体积的计算的话与工厂模式一样处理。但当我们需求如下:在某些计算中我们只需要计算图形面积,而在某些计算中我们只需要计算图形体积。这时我们希望原创 2016-12-31 19:26:11 · 306 阅读 · 0 评论 -
创建型模式之生成器/建造者BUILDER
意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 一、介绍建造者模式用于对于复杂对象的建立。由于复杂对象过于繁杂,采用一步一步建立的方式。 以KFC为例,KFC店食品可以自由组合,顾客可以根据需求点各种食品。这就需要我们首先的列出各种食品的信息,通过接口Item继承实现各种食物,然后使用一个容器Meal来承载这些食品,并提供各种操作方法。对于某些套餐,可以提供Me原创 2017-01-03 13:17:39 · 384 阅读 · 0 评论 -
创建型模式之单例模式SINGLETON
一、简析 单例模式原则就是该类自己创建自己的对象,且只能有一个对象被创建。一般情况对于打印机,数据库连接等减少内存开销,避免多线程同时访问问题会使用该模式。 根据原则: 只能有一个实例:必须私有构造函数不给其他函数创建机会,且每次调用需要判断是否已经存在实例,为了让该实例始终存在需static; 必须自己创建实例:由于构造函数私有,只能在类自身内部实例化对象,所以只能通过静态方法调用实例化函原创 2017-01-01 23:16:34 · 287 阅读 · 0 评论 -
创建型模式之原型模式PROTOTYPE
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。一、原型模式原型模式应用场景主要在于当一个对象的创建非常复杂,消耗很多资源之时。如果一个对象的创建之前需要经过很过步骤和要求,一般情况对象用完就会销毁。但为了避免资源的消耗。可以把对象存住,下次使用时直接复制原型。 java 克隆 二、代码原料 主要在于实现java对象的克隆package prototype;public原创 2017-01-05 14:13:05 · 418 阅读 · 0 评论 -
行为型模式之解释器INTERORETER
一、意图定义一种规则,然后用解释器来解释该规则。二、图解正则表达式为例,正则表达式存在一种规则,在搜索匹配字符串时,根据这种规则解析,搜索符合要求的子字符串。 约定一下规则: 建立解释器: 正则表达式实例: 解释器解释该实例形成的语法树: 最高效的解释器通常不是通过直接解释语法分析树实现的 , 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种原创 2017-03-07 21:21:40 · 316 阅读 · 0 评论 -
行为型模式之迭代器INTERATOR
一、意图提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示。二、图解C++的STL常用类实现机制。将类列表迭代部分从类中分离出来放入一个迭代器。 但上图List和ListIteraotr耦合在一起。可将迭代器概念推广至多态迭代。 为了让迭代器无需依赖具体列表子类,可以让列表对象类实例化迭代器。迭代器对复杂聚合可以使用多种方式进行遍历。且简化了聚合的接口。同一个聚原创 2017-03-07 21:55:19 · 262 阅读 · 0 评论 -
设计模式MIxin 特殊的多继承
一、意图给类增加一些额外功能。在保持单一继承的纯净性,又避免由于单一继承产生的复杂的继承层次结构。类似于JAVA中的Interface(规格继承:只是定义了一些列接口),但是Mixin(属于实现继承)能够有实现方法。二、图解 对于多继承,如上会存在这样问题: 如果类D对象调用一个方法,在类B、C、D中都没有,而类A中有,那么语言的机制是应该从DBA这条线寻找方法,还是从DCA这条线; 如果类B原创 2017-03-28 23:08:32 · 1863 阅读 · 0 评论 -
设计模式图示 速记速查
创建型工厂模式: 抽象工厂: 单例模式: 建造者: 原型模式: 结构型适配器: 桥接模式: 组合模式: 装饰模式: 外观模式: 享元模式: 代理模式: 行为型职责链: 命令模式: 解释器: 迭代器: 中介者: 备忘录: 观察者: 状态模式: 策略模式: 模板方法: 访问者:原创 2017-03-22 20:59:04 · 755 阅读 · 0 评论 -
行为型模式之访问者VISITOR
一、意图改变类结构形式,可在不改变各元素类的前提下定义新的操作。二、图解 上图node层次将各个操作分布到节点类中导致系统难以理解和维护,比如TypeCheck()和PrettyPrint()不同用途放置一起,产生混乱。重要的是如果增加新操作,就要重新编译所有的这些类。VISITOR模式将每个类中相关操作包装成一个独立对象。如下图 访问当前节点时,我们可以将VISITOR对象传递给当前节点,原创 2017-03-10 12:47:05 · 239 阅读 · 0 评论 -
行为型模式之模板方法TEMPLATE METHOD
一、意图在模板类中定义算法骨架,而将一些具体步骤延迟到子类中。二、图解 如上图,Application模板类在OpenDocument定义了打开一个文档的基本步骤:检测文档是否能被打开CanOpenDocument—-创建文档DoCreateDocument—-读取文档DoRead。对于读取任何格式的文档,这种基本的逻辑步骤都是一样的,但是我们看到CanOpenDocument,DoCreateD原创 2017-03-10 11:13:04 · 294 阅读 · 0 评论 -
行为型模式之观察者OBSERVER
一、意图当一个对象的状态发生改变时,所以依赖它的对象都会得到通知并被自动更新。二、图解在excel中,当数据变化时,与数据对应的表格和图形都会随之变化。这就需要数据在变化时自行通知其的依赖类,随之改变。 如图Subject对象维持一个依赖它的观察对象表,当Subject内容发生变化,需要通知观察者时就会调用观察者对象的update函数。为了降低耦合,subject只知道其有一些列的观察者,但不原创 2017-03-09 21:28:30 · 240 阅读 · 0 评论 -
结构型模式之适配器ADAPTER
推荐先看《敏捷开发:原则、模式与实例》了解基本开发原则一、意图如果我们需要使用另一个类,但是这个类的接口与我们现有代码不接口不兼容,可以使用Adapter模式使得不兼容接口一起工作。二、图解 如上图Shape类是我们现有代码,现在需要复用TextView。但是观察两个类内的函数,可以发现Shape内BoundingBox()与TextView内的GetExTent()作用相同。但是由于函数名不同,原创 2017-02-28 11:13:34 · 371 阅读 · 0 评论 -
结构型模式之桥接BRIDGE
推荐先看《敏捷开发:原则、模式与实例》了解基本开发原则一、意图将抽象部分同其实现部分分离开来,使其可以独立变化。二、图解 上图为了实现多平台应用,使用继承分别定义了X平台和PM平台的两个window子类。当我们添加一个IconWindow子类用于处理图标时,为了支持X和PM平台,我们又不得不实现两个新类XIconWindow和PMIconWindow,而且二者所用代码可能与原来Xwindow和PM原创 2017-03-01 10:41:10 · 344 阅读 · 0 评论 -
结构型模式之组合COMPOSITE
推荐先看《敏捷开发:原则、模式与实例》了解基本开发原则一、意图将对象组合成树形结构以表示部分-整体层次结构,使得 单个组件与组合组件具有一致性。二、图解 上图可知Line,Rectangle,Text属于基本组件,而Picture可以对这些组件进行组合,需要什么往容器添加什么组件。一致性表现在继承自Graphic,都具有Draw()方法,但是Picture类确实通过调用其他组件的Draw()实现的原创 2017-03-02 10:12:31 · 251 阅读 · 0 评论 -
结构型模式之装饰DECORATOR
推荐先看《敏捷开发:原则、模式与实例》了解基本开发原则一、意图动态给对象添加一些额外职责。二、图解有时我们希望给某个对象添加一些功能,但是又不想破坏原有类的结构,如果采用继承方式就无法控制添加的时机和多样式。装饰模式采取动态添加的方式解决该问题。 如上图如果我们想给TextView对象添加滑动框,我们就可以将TextView对象传递到ScrollDecorator对象中去,使用ScrollDe原创 2017-03-02 12:58:36 · 278 阅读 · 0 评论 -
结构型模式之外观FACADE
一、意图为子系统提供一个统一的界面。二、图解 三、结构四、其他使用抽象类实现Facade,而其具体子类对应不同的子系统实现,进一步降低客户与子系统间耦合度原创 2017-03-03 09:14:47 · 255 阅读 · 0 评论 -
结构型模式之享元FLYWEIGHT
一、意图运用共享技术有效地支持大量细粒度的对象二、图解 对于一个文档编辑器,如果我们对每个文字都建立个对象将会消耗大量的内存。由于英文字母只有26个,如果我们只建立26个对象,而文档编辑器内的文字都都是共享的这些对象。如下图: 但是Flyweight对象应该只存自己的内部状态,如:字母只存储字符代码,而不存储它的大小,字体等外部状态。外部信息由用户提供,Flyweight自己根据信息绘画自己原创 2017-03-03 09:44:52 · 468 阅读 · 0 评论 -
结构型模式之代理PROXY
一、意图为其他对象提供一种代理以控制对这个对象的访问。二、图解如果需要的对象的创建和初始化都需要非常大开销,那么一般我们就得在需要这个对象的时候才创建它。 如上图,ImageProxy用于代理Image类,当需要实例化时才实例化。如果我们需要保护某个对象,控制对原始对象的访问时候,也可以使用代理模式。而且我们可以对实际对象引用计数,当不需要是就释放对象;在访问实际对象时检查是否已经锁定。cop原创 2017-03-04 09:43:08 · 219 阅读 · 0 评论 -
行为型模式之职责链CHAIN OF RESPONSIBILITY
一、意图将处理请求的对象连成一条链,逐步传递该请求,直到有对象能够处理。二、图解 可以看到当子类Button不能处理对象时就调用父类Widget方法,沿链转发请求直到最后有对象能够处理它。应该根据从详细的,然后到普遍通用来组织传递过程。 三、结构四、其他职责链降低了耦合度,请求对象无需知道处理该请求的是哪一个对象。请求可能到链末端都得不到处理原创 2017-03-04 11:08:01 · 280 阅读 · 0 评论 -
行为型模式之中介者MEDIATOR
一、意图用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。二、图解当我们打开一个交互窗口,选择列表中某一项时,改变对于输入域的内容。反之在输入域修改内容可能会修改某些按钮使用功能。如果我们只是简单当某个组件修改时就去调用另一个组件,那么每个组件必须知道其他组件的存在。这样组件间就会产生依赖许多关系,对任何部分的修改都会影响全原创 2017-03-08 09:56:06 · 231 阅读 · 0 评论 -
行为型模式之命令COMMAND
一、意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。二、图解 COMMAND模式的意图很是费解,以上图为例,个人理解为,本来我们可以直接在菜单项MenuItem的点击方法中直接调用我们请求对象,但是如果我们不知道被请求的操作或请求接受者的任何信息(这部分不是你设计的),那么我们就不能显示实现该请求。而COMMAND模式将请求变为原创 2017-03-05 09:59:18 · 392 阅读 · 0 评论 -
行为型模式之备忘录MEMENTO
一、意图在不破坏封装性情况下,在对象之外保存该对象的内部状态,实现可撤销回原来状态。二、图解为实现撤销机制,我们需要先保存对象的内部状态,当需要撤销时,恢复成过去的状态。但是由于有些对象的某些状态是私有的,不可向外暴露,使得其状态不能被其他对象访问。因此我们需要对象内部自己生成备忘录,但存储在外部。 如上,原发器Originator是需要保存状态的对象,Memento是保存Originator原创 2017-03-09 13:08:12 · 250 阅读 · 0 评论 -
图示符号指南
类图 对象图交互图原创 2017-03-10 13:07:15 · 443 阅读 · 0 评论