随笔分类 -  设计模式

摘要:在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化 在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解析器来解释这样的句子,从而解决问题 GoF:给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个 阅读全文
posted @ 2021-07-29 15:28 cxc1357 阅读(59) 评论(0) 推荐(0)
摘要:创建型:在创建对象的同时隐藏创建逻辑 工厂 目的:生成跨平台对话框 结构:工厂类 [ ( 实体接口 ) 获取对象 ],实体接口 ( 抽象方法 ),实体类( 具体方法 ) 中间层:将创建过程抽象为工厂类 接口化:将对话框动作抽象为接口 对象化:将具体平台对话框抽象为对象 构建器 目的:生成肯德基套餐 阅读全文
posted @ 2020-06-12 22:51 cxc1357 阅读(187) 评论(0) 推荐(0)
摘要:一个目标:管理变化,提高复用 两种手段:分解,抽象 八大原则 所有模式UML图的类名改为A, B ...,方法名改为F1(), F2()... 三种模型 继承和组合对象的内存模型一样 组合对象缺乏变化,组合指针具备灵活性 设计模式中多用组合指针(指针指向多态对象,表达灵活性,可用B1, B2...等 阅读全文
posted @ 2020-06-11 08:37 cxc1357 阅读(171) 评论(0) 推荐(0)
摘要:概述 属于行为型模式 将算法与其作用的对象隔离开 动机:由于需求的变化,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的负担,甚至破坏原有设计 如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述 阅读全文
posted @ 2020-06-11 00:04 cxc1357 阅读(171) 评论(0) 推荐(0)
摘要:概述 属于行为型模式 对象需要根据自身当前的状态进行不同行为,状态数量多且状态相关的代码频繁变更 在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样 组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题 阅读全文
posted @ 2020-06-10 21:00 cxc1357 阅读(206) 评论(0) 推荐(0)
摘要:概述 也叫快照(SnapShot) 属于行为类设计模式 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态 软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能回溯到对象之前处于某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现 如何实现 阅读全文
posted @ 2020-06-09 16:57 cxc1357 阅读(218) 评论(0) 推荐(0)
摘要:概述 减少对象之间混乱无序的依赖关系,限制对象之间的直接交互,迫使他们通过一个中介者进行合作 软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化 这种情况下,可使用一个“中介对象”来管理对象间的关联关 阅读全文
posted @ 2020-06-09 14:56 cxc1357 阅读(210) 评论(0) 推荐(0)
摘要:概述 属于行为型模式 将集合的遍历行为抽取为单独的迭代器对象 所有迭代器实现相同的接口,只要有合适的迭代器,客户端代码就能兼容任何类型的集合或遍历算法,如需采用特殊方法遍历集合,创建一个新的迭代器即可,而无需对集合或客户端进行修改 集合对象内部结构常常变化各异,但对于这些集合对象,我们希望在不暴露其 阅读全文
posted @ 2020-06-08 15:26 cxc1357 阅读(168) 评论(0) 推荐(0)
摘要:概述 “行为变化”模式:组件构建过程中,组件行为的变化经常会导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合 动机:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——如需要对行为进行“记录、撤销 阅读全文
posted @ 2020-06-08 11:43 cxc1357 阅读(191) 评论(0) 推荐(0)
摘要:概述 属于结构型模式 提供代理作为对象的替代品或其占位符,代理控制对原对象的访问,并可对请求在提交给对象前后进行一些处理 由于某种原因(如对象创建开销很大,某种操作需要安全控制,或者需要进程外访问等)直接访问会给使用者或者系统结构带来很多麻烦 如何在不失去透明操作对象的同时来管理 / 控制这些对象特 阅读全文
posted @ 2020-06-07 23:16 cxc1357 阅读(171) 评论(0) 推荐(0)
摘要:概述 缓存、Cache、Flyweight 属于结构型模式 不在每个对象中保存所有数据,而是共享多个对象所共有的相同状态,实现在有限的内存中载入更多的对象 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行(内存)代价 如何在避免大量细粒度对象问题的同时,让外 阅读全文
posted @ 2020-06-07 22:52 cxc1357 阅读(90) 评论(0) 推荐(0)
摘要:概述 也称外观模式 按目的属于结构型模式,按封装属于接口隔离模式 在组件构建过程中,某些接口之间的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口 软件是人和硬件间的间接,操作系统是软硬件间的间接,虚拟机是操作系统和软件间的间接 电脑外部接口(显示 阅读全文
posted @ 2020-06-07 21:57 cxc1357 阅读(245) 评论(0) 推荐(0)
摘要:概述 数据结构模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用 将这些特定数据模式封装在内部,对外提供统一的接口,来实现与特定数据结构无关的访问 典型模式:Composite, Iterator, Chain of Resposibility 阅读全文
posted @ 2020-06-07 18:46 cxc1357 阅读(200) 评论(0) 推荐(0)
摘要:概述 属于“单一职责”模式(子类膨胀,需要划清职责) 属于结构型模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而在开发时分别使用 动机:某些类型固有的实现逻辑,使得它们有多个变化的维度 如何应对多维度变化,如何利用面向对象技术来使得类型可以轻松沿着多个方向变化,而不引入 阅读全文
posted @ 2020-06-07 17:15 cxc1357 阅读(198) 评论(0) 推荐(0)
摘要:类之间关系(由强到弱) realize(继承):三角+实线(指向类),继承类(SUV是一种汽车) generalization(实现):三角+虚线(指向接口),实现接口(汽车是一种车) composition(组合):实菱形+实线(指向个体),强依赖(汽车没了,发动机就没了),特殊的聚合,构造函数 阅读全文
posted @ 2020-06-07 11:50 cxc1357 阅读(208) 评论(0) 推荐(0)
摘要:概述 由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但新环境要求的接口是这些现存对象所不满足的 如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口? Adapter举例 将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼 阅读全文
posted @ 2020-06-07 11:43 cxc1357 阅读(193) 评论(0) 推荐(0)
摘要:概述 使用多个简单对象一步步构建成一个复杂对象 有时面临“一个复杂对象”的的创建工作,通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂的对象各个部分经常面临着剧烈的变化,但将他们组合在一起的算法却相对稳定 将一个复杂对象的构建(HouseBuilder)与其表示(House)相分离, 阅读全文
posted @ 2020-06-02 15:24 cxc1357 阅读(228) 评论(0) 推荐(0)
摘要:概述 动机:“某些结构复杂对象”的创建工作,由于需求的变化,这些对象面临剧烈的变化,但它们却拥有比较稳定一致的接口 如何应对这种变化,如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变 使用原型实例指定创建对象的种类,然后通过拷 阅读全文
posted @ 2020-06-02 14:45 cxc1357 阅读(146) 评论(0) 推荐(0)
摘要:概述 属于“对象性能”模式 面向对象很好地解决了“抽象”的问题,但不可避免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可忽略不计(继承),但某些特殊情况,面向对象带来的成本须谨慎处理(虚函数倍乘效应) 动机:软件系统中有些特殊的类,必须确保它们在系统中只存在一个实例,才能确保逻辑正确及良 阅读全文
posted @ 2020-06-01 14:47 cxc1357 阅读(197) 评论(0) 推荐(0)
摘要:场景 按目的划分,属于结构型模式;按封装划分,属于单一职责模式 使用继承来扩展对象的功能时,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性,并且随着子类的增多,各种子类的组合会导致更多子类的膨胀 如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题 阅读全文
posted @ 2020-04-04 19:39 cxc1357 阅读(160) 评论(0) 推荐(0)