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

模板方法模式:

定义:定义一个操作中的算法的骨架。而将一些步骤延伸到子类中。模板方法使得子类能够不改变算法的结构就可以重定义该算法的某些特定步骤。

(1),用了继承,而且肯定这个继承有意义的情况下。就应该要成为子类的模板,所以反复的代码都应该提升到父类中,而不是让每一个子类去反复。

(2)。当我们要完毕某一个细节层次一致的过程或者一系列步骤,但其个别步骤在更具体的层次上的实现可能不同一时候。我们通常考虑模板方法模式来处理。

(3),模板方法模式通过把不变的行为搬移到超类。去除子类中的反复代码来体现它的优势。

(4)。党不变的和可变的行为在方法的子类实现中混合在一起的时候。不变的行为就会在子类中反复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱反复的不变形为的纠缠。

Effective C++:

1:设计 class 宛如设计 type

Class的设计就是 type 的设计。在定义一个新的 type 之前,请确定你已经考虑好下面覆盖的讨论主题。(Oh , my god ! )

(1)。新类型的对象该怎样创建和销毁?

(2)。对象的初始化和对象的赋值有什么样的区别?

(3),新类型的对象假设被 passed by value 。意味着什么?

(4),什么是新类型的合法值?

(5),你的新类型须要配合某个继承图系(inheritance graph)吗?

(6),你的新类型须要什么样的转换?

(7),什么样的操作符和函数对此新类型而言是合理的?

(8)。什么样的标准函数应该被驳回?

(9),谁该取用新类型的成员?

(10),什么是新类型的“未声明接口?

(11),你的新类型有多么一般化?

(12),你真的须要一个新类型么?

2:宁以 pass-by-reference-to-const 替换 pass-by-value

(1),尽量以 pass-by-reference-to-const 替换 pass-by-value 。前者通常比較高效,而且能够避免分割问题 (slicing problem)。

(2)。以上规则并不适用内置类型,以及 STL 的迭代器和函数对象。对他们而言,往往 pass-by-value 比較合适。

3:必须返回对象时,别妄想返回其 reference

(1)。绝不要返回 pointer 或 reference 指向一个 local stack 对象,或返回 reference 指向一个 heap-allocated 对象,或返回 pointer 或 reference 指向一个 local static 对象而有可能同一时候须要多个这种对象。单线程中合理返回 reference 指向一个 local static 对象。可參考单例模式。

时间: 2024-10-12 13:35:59

学习日记之模板方法模式和 Effective C++的相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

学习日记之大话设计模式和Effective C++大结局

第一次潜心学习一个月时间,看完了<大话设计模式>和<Effective C++>两本书,两本书的前半部分都比较容易,但是后期的部分,比如:C++的内存,异常和模板的知识就很难理解了.也许和自己很少用异常处理和模板的关系吧.自己坚持了一个月,无论如何,这两本书给我带来了很多新的知识,发现了自己的不足.接下来打算继续看<C++ Templates>这本书,希望能弥补自己在模板编程方便的不足和为以后研究STL和Boost打下坚实的基础.废话少说,言归正传.下面说一下两本书的最