学习日记之备忘录模式和继承、面向对象设计

备忘录模式(Memento):在不破坏封装性的前提下。捕获一个对象的内部状态,并在该对象之外保存这个状态。

这样以后就可将该对象恢复到原先保存的状态。

(1),把要保存的细节给封装在 Memento 中,那一天要更改保存的细节也不用影响client了。

(2),Memento 模式比較适用于功能比較复杂的,但须要维护或记录属性历史的类,须要保存的属性仅仅是众多属性中的一小部分时,Originator 能够依据保存的 Memento 信息还原到前一状态。

(3),假设在某个系统中使用命令模式时。须要实现命令的撤销功能。那么命令模式能够使用备忘录模式存储可撤销操作的状态。

(4)。当角色的状态改变的时候。有可能这个状态无效,这时候就能够使用临时存储起来的备忘录将状态复原。

Effective C++:

1:确定你的 public 继承塑模出 is-a 关系

(1)。”public 继承“意味 is-a 。适用于 base classes 身上的每一件事情一定也适用于 derived classes 身上,由于每个 derived class 对象也都是一个 base class 对象。

2:避免遮掩继承而来的名称

(1)。derived classes 内的名称会遮掩 base classes 内的名称。在 public 继承下从来没有人希望如此。

(2)。 为了让遮掩的名称再见天日,可使用 using 声明式或转交函数(forwarding functions)。

时间: 2024-10-12 18:35:12

学习日记之备忘录模式和继承、面向对象设计的相关文章

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法

学习日记之迭代器模式和Effective C++

迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示. (1),当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑迭代器模式. (2),你需要对聚集有多种方式遍历时,可以考虑用迭代器模式. (3),当遍历不同的聚集结构,应提供如开始.下一个.当前项等统一的接口. (4),迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样即可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据. Effec

学习日记之桥接模式和多重继承

桥接模式: (1),继承很多情况下会带来麻烦,比如:对象的继承关系在编译时就定义好了,所以无法在运行时改变从弗雷继承的实现.子类的实现与它的弗雷有非常紧密的依赖关系,以至于弗雷视线中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类代替.这种依赖关系限制了灵活性并最终限制了复用性. (2),合成/聚合服用原则(CARP):尽量使用合成/聚合,尽量不要使用类继承. (3),聚合表示一种弱的'拥有'关系,体现的是 A 对象可以

学习日记之组合模式和Effective C++

组合模式(Composite):将对象组合成树形结构以表示"部分-整体"的组合结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 透明方式和安全方式 (1),透明方式:在 Component 中声明所有用来管理子对象的方法,其中包括 Add. Remove 等.这样实现 Component 接口的所有子类都具备了 Add.Remove 方法.这样做的好处是子类对外界来说没有区别,他们具有完全一致的行为接口.但也有问题,有些子类不具备某些功能,所以实现那些接口没有意义. (2)

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

学习日记之命令模式和Effective C++

命令模式(Command): 讲一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求队列或记录请求日志,以及支持可撤销的操作. 命令模式优点: (1),它能较容易地设计一个命令队列. (2),在需要的情况下,可以较容易地将命令计入日志. (3),允许接收请求的一方决定是否要否决请求. (4),可以容易地实现请求的撤销和重做. (5),由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易. (6),命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开. (

学习日记之建造者模式和Effective C++

建造者模式(Builder):建一个复杂的对象的构建和它的表示分离,使得同样的构造过程可以创建不同的表示. (1),主要创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化. (2),建造者模式的好处就是使得建造代码和表示代码分离,由于建造者隐藏了该产品是符合组装的,所以如需要改变一个产品的内部表示,主需要在定义一个具体的建造者就可以了. (3),建造者模式是在创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式. Effect

学习日记之模板方法模式和 Effective C++

模板方法模式: 定义:定义一个操作中的算法的骨架.而将一些步骤延伸到子类中.模板方法使得子类能够不改变算法的结构就可以重定义该算法的某些特定步骤. (1),用了继承,而且肯定这个继承有意义的情况下.就应该要成为子类的模板,所以反复的代码都应该提升到父类中,而不是让每一个子类去反复. (2).当我们要完毕某一个细节层次一致的过程或者一系列步骤,但其个别步骤在更具体的层次上的实现可能不同一时候.我们通常考虑模板方法模式来处理. (3),模板方法模式通过把不变的行为搬移到超类.去除子类中的反复代码来体

学习日记之原型模式和Effective C++

原型模式(Prototype):用原型实例制定创建对象的种类,而且听过拷贝这些原型创建新的对象. 浅复制:假设字段是值类型的,则对该字段运行逐位复制.假设字段是引用类型.则复制引用但不复制引用的对象.因此,原始对象及其副本引用同一对象. 深复制:把引用变量的对象指向复制过的新对象.而不是原有的被引用的对象. Effective C++: 1:在资源管理类中提供对原始资源的訪问. (1).APIs 往往要求訪问原始资源(raw resources),所以每个 RAII class 应该提供一个"取