- 博客(113)
- 资源 (9)
- 收藏
- 关注
原创 Visitor(访问者)--对象行为型模式
Visitor(访问者)–对象行为型模式一、意图表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。二、动机1.在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来繁重的变更负担,甚至破坏原有设计。2.如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?三、适用性1.一个对象结构包含很多类对象,他们有不同的接
2021-08-06 07:42:25
303
原创 Template Method(模板方法)--类行为型模式
Template Method(模板方法)–类行为型模式一、意图定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。二、动机1.在软件构建过程中,对于某一项任务,它常常有稳定的整体操作 结构,但各个子步骤却有很多改变的需求,或者由于固有的原因 (比如框架与应用之间的关系)而无法和任务的整体结构同时实现。2.如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变 化或者晚期实现需求?三、适用性1.一次
2021-08-06 07:15:47
179
原创 Strategy(策略)--对象行为型模式
Strategy(策略)–对象行为型模式一、意图定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。二、动机1.在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂; 而且有时候支持不使用的算法也是一个性能负担。2.如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?三、适用性1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置
2021-08-05 18:24:00
264
原创 State(状态)--对象行为型模式
State(状态)–对象行为型模式一、意图允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。二、动机1.在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。2.如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?三、适用性1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。2.一个操作中含有庞大的多分支的条件语句,且这些分
2021-08-05 17:27:24
490
原创 Observer(观察者)--对象行为型模式
Observer(观察者)–对象行为型模式一、意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有的依赖于它的对象都得到通知并被自动更新。二、动机1.在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密, 将使软件不能很好地抵御变化。2.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。三、适用性1.当一个抽象模
2021-08-05 17:03:35
244
原创 Memento(备忘录)--对象行为型模式
Memento(备忘录)–对象行为型模式一、意图在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保持这个状态。这样以后就可将该对象恢复到原先保存的状态。二、动机1.在软件构建过程中,某些对象的状态子啊转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。2.如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。三、适用性1.必须保存一个对象在某个时刻的(部分)状态,这
2021-08-05 16:31:41
164
原创 Mediator(中介者)--对象行为型模式
Mediator(中介者)–对象行为型模式一、意图用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。二、动机1.在软件构建过程中,经常会出现多个对象相互关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。2.在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。三、适用性1.一组对象以定义
2021-08-05 11:33:53
160
原创 Iterator(迭代器)--对象行为模式
Iterator(迭代器)–对象行为模式一、意图提供一种方法顺序访问一个聚合对象的各个元素,而又不需暴露该对象的内部结构。二、动机1.在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供可能。2.使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。三、适用性1.访问一个聚合对象的内容而无需暴
2021-08-05 10:10:43
160
原创 Interpreter(解释器)--类行为型模式
Interpreter(解释器)–类行为型模式一、意图给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。二、动机1.在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。2.在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器解释这样的句子,从而达到解决问题的目的。三、适用性当一个语言需要解释器执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解
2021-08-05 09:14:11
340
原创 Command(命令)--对象行为型模式
Command(命令)–对象行为型模式一、意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。二、动机1.在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销、重做(undo、redo)、事物”等处理,这种无法抵御变化的紧耦合是不合适的。2.在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。三、适用性1.抽象出
2021-08-04 22:11:43
203
原创 Chain of responsibility(职责链)--对象行为型模式
Chain of responsibility(职责链)–对象行为型模式一、意图使多个对象有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。二、动机1.在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。2.如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。三、适用性1.有多
2021-08-04 20:19:37
173
原创 Proxy(代理)--对象结构型模式
Proxy(代理)–对象结构型模式一、意图为其他对象提供一种代理以控制对这个对象的访问。二、动机1.在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很大麻烦。2.如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。三、适用性1.远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。2.虚代理(Virtual Pro
2021-08-03 22:44:04
500
原创 Flyweight(享元)--对象结构型模式
Flyweight(享元)–对象结构型模式一、意图运行共享技术有效地支持大量细粒度的对象。二、动机1.在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。2.如果在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?三、适用性Flyweight模式的有效性很大程序上取决于如何使用它以及在何处处理它。1.一个应用程序使用了大量的对象。2.完全由于使用大量的对象,造成很大的存储开销。
2021-08-03 22:10:43
170
原创 Facade(外观)--对象结构型模式
Facade(外观)–对象结构型模式一、意图为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。二、动机1.上述左边方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。2,如何简化外部客户程序和系统间的接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?三、适用性1.当你要为一个复杂子系统提供一个简单的接口时。子系统往往因为不断演化而变得
2021-08-03 21:33:54
165
原创 Decorator(装饰)--对象结构型模式
Decorator(装饰)–对象结构型模式一、意图1.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。二、动机1.在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。2.如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能 扩展变化
2021-08-03 20:39:37
210
原创 Composite(组合)--对象结构型模式
Composite(组合)–对象结构型模式一、意图将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。二、动机1.软件在某些情况下,客户代码过多的依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。2.如何将“客户代码与复杂代码的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?三、适用
2021-08-03 17:19:49
371
原创 Bridge(桥接)--对象结构模式
Bridge(桥接)–对象结构模式一、意图将抽象部分与它的实现部分分离,使它们都可以独立的变化。二、动机1.由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。2.如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?三、适用性1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。2.类的抽象以及它的实现都应该部分进行组合,并分别对
2021-08-03 16:46:04
220
原创 Adapter(适配器)--类对象结构型模式
Adapter(适配器)–类对象结构型模式一、意图将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本接口
2021-08-02 22:36:40
293
原创 Singleton(单件)--对象创建模式
Singleton(单件)——对象创建模式一、意图保证一个类仅有一个实例,并提供一个访问它的全局访问点。二、动机1.在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。2.如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?3.这应该是类设计者的责任,而不是使用者的责任。三、适用性1.当类只能有一个实例且客户可以从一个众所周知的访问点访问它时。2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用
2021-08-02 16:53:41
140
原创 Prototype(原型)--对象创建模式
Prototype(原型)–对象创建模式一、意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。二、动机1.在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。2.如果应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?三、适用性当一个系统应该独立于它的产品创建、构建和表示时,要使用prototype模式;以
2021-08-02 16:23:36
219
原创 Factory Method(工厂方法)--对象创建型模式
Factory Method(工厂方法)–对象创建型模式意图定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
2021-08-02 15:09:41
219
原创 Builder(生成器)--对象创建型模式
Build(生成器)–对象创建型模式意图将一个复杂的对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示。动机1.在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在 一起的算法却相对稳定。2.如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不 随着需求改变而改变?...
2021-08-02 11:16:54
433
原创 Abstract Factory(抽象工厂)--对象创建模式
Abstract Factory 抽象工厂意图提供一个创建一系列相关或者相互依赖的接口,而无需指定它们具体的类。动机(Motivation)1.在软件系统中,经常面临着“一系列相互依赖的对象”的创建工 作;同时,由于需求的变化,往往存在更多系列对象的创建工作。2.如何应对这种变化?如何绕过常规的对象创建方法(new),提供一 种“封装机制”来避免客户程序和这种“多系列具体对象创建工作” 的紧耦合?实用性1.一个系统要独立于它的产品的创建、组合和表示时。2.一个系统要由多个产品系列中的一个来配
2021-08-02 10:32:56
183
原创 面向对象的设计原则
(1)面向对象的设计原则一. 依赖倒置原则(Dependence Inversion Principle,DIP)高层模块(稳定)不应该依赖于底层模块(变化)二者都应该依赖于抽象(稳定)。抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。二. 开放封闭原则(Open Closed Principle,OCP)对扩展开放,对更改封闭。类模块应该是可扩展的,但是不可修改。三.单一职责原则(Single Responsibility Principle,SRP)一
2021-07-30 22:23:21
87
原创 lua transliterate实现(lua程序设计10.6练习10.3题)
lua transliterate实现(lua程序设计10.6练习10.3题)local function transliterate(s,t) return (string.gsub(s,"%a",function(a) if t[a] == false then return "" elseif t[a] then return t[a] end end))endlocal s = "
2021-07-27 11:08:17
102
原创 lua split实现(lua程序设计10.6练习10.1题)
lua spit实现(lua程序设计10.6练习10.1题)local function split(s,sp) local t = {} local last = 1 local i repeat i = string.find(s,sp,last,true) if i then if i ~= last then t[#t+1] = string.sub(s,last,i-1)
2021-07-27 10:37:58
121
原创 lua URL解码
lua ULR解码local function unescape(s) s = string.gsub(s,"+"," ") s = string.gsub(s,"%%(%x%x)",function(h) return string.char(tonumber(h,16)) end) return sendlocal cgi = {}local function decode(s) for name,value in string.gmat
2021-07-27 06:51:25
512
原创 用空代理实现account(lua程序设计21.7练习21.4题)
用空代理实现account(lua程序设计21.7练习21.4题)function createAccount() local proxy = {} local mt = {balance = 0} mt.withdraw = function(v) mt.balance = mt.balance - v end mt.deposit = function(v) mt.balance = mt.balance + v end mt.getBalance = fun
2021-07-26 16:16:57
78
原创 使用对偶表示重新实现Stack(lua程序设计21.7练习21.3题)
使用对偶表示重新实现Stack(lua程序设计21.7练习21.3题)local data = {}DualStack = {}function DualStack:new(o) o = o or {} self.__index =self setmetatable(o,self) data[o] = {} return oendfunction DualStack:push(v) table.insert(data[self],v)endfu
2021-07-26 15:49:52
151
原创 lua实现继承(lua程序设计21.7 练习21.2题)
lua实现继承(lua程序设计21.7 练习21.2题)StackQueue = Stack:new()function StackQueue:insertBottom(v) table.insert(self,1,v)endlocal stack2 = StackQueue:new()for i = 1, 10 do stack2:push(i)endstack2:insertBottom(11)while not stack2:isempty() do pr
2021-07-26 15:21:30
98
原创 lua实现stack(lua程序设计21.7 练习21.1题)
lua实现stack(lua程序设计21.7 练习21.1题)Stack = {}function Stack:new(o) o = o or {} self.__index = self setmetatable(o,self) return oendfunction Stack:push(v) table.insert(self,v)endfunction Stack:pop() local v = self[#self] table.
2021-07-26 14:40:59
232
原创 给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)
给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)template<typename T>void insert_recursive(BinaryTree<T>& tree,BinaryTreeNode<T>* root, BinaryTreeNode<T>* node){ if(tree.root == nullptr) { tree.root = node; return;
2021-07-20 08:53:31
99
原创 二叉搜索树
二叉搜索树#ifndef C11LEARN_BINARYSEARCHTREE_H#define C11LEARN_BINARYSEARCHTREE_H#include "../chapter10/BinaryTreeNode.h"template<typename T>class BinarySearchTree{protected: BinaryTreeNode<T>* root; int size;public: BinarySearch
2021-07-19 21:49:51
287
Mobile Speech Recognizer 1.2
2017-09-05
Google Cloud Speech Recognition 3.0
2017-09-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人