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

组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的组合结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

透明方式和安全方式

(1),透明方式:在 Component 中声明所有用来管理子对象的方法,其中包括 Add、 Remove 等、这样实现 Component 接口的所有子类都具备了 Add、Remove 方法。这样做的好处是子类对外界来说没有区别,他们具有完全一致的行为接口。但也有问题,有些子类不具备某些功能,所以实现那些接口没有意义。

(2),安全方式:在 Component 中不去声明 Add、 Remove 方法,那么子类也就不用去实现它,而是在 composite 声明所有用来管理子类对象的方法,这样做不会出现透明方式的问题,但是因为子类之间具有不同的接口,客户端调用需要做相应的判断,带来了不便。

(3),需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象和单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式了。

组合模式好处:

(1),定义了包含基本对象和组合对象的层次结构,基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。

(2),用户不用管理到底是处理一个基本对象还是一个组合对象,也不用未定义组合而写一些判断语句、

(3),组合模式让客户可以一致地使用组合结构和单个对象。

Effective C++:

1:区分接口继承和实现继承

(1),接口继承和实现继承不同。在 public 继承下,derived classes 总是继承 base class 的接口。

(2),pure virtual 函数只具体指定接口继承。

(3),简朴的 impure virtual 函数具体指定接口继承及缺省实现继承。

(4),non-virtual 函数具体指定接口继承以及强制性实现继承。

学习日记之组合模式和Effective C++,布布扣,bubuko.com

时间: 2024-08-08 13:57:05

学习日记之组合模式和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++

命令模式(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 应该提供一个"取

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

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

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

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