GeekBand C++面向对象高级编程(上)第三周

本周内容:

Composition:


一个class里面完整包含另一个class

图像表示如图



Delegation 就是 Composition by reference

里面对StringRep 通过指针引用

实现了“防火墙”,隔离作用,改变body不影响handle




虚函数是成员函数,且非static

如果某类中:一函数为虚函数,则:该函数在派生类中可能有不同的定义

pure virtual:基类中完全不定义完全交给派生类去定义

impure virtual:虽然派生类可以去自己定义,但基类中也定义了

non-virtual:派生类不能修改


基类为CDocument,里面有OnFileOpen函数,函数里一系列函数,其中包括有Serialize函数,该函数为虚函数,未定义

创建派生类CMyDoc,里面定义Serialize函数——交给子类定义:Template Method

main里创建CMyDoc对象,调用父类函数OnFileOpen,执行到里面的Serialize时,转向执行子类中定义的 虚函数




类之间的三大关系、继承(inheritance)、复合(composition)、,委托(delegation)

三种关系中,最简单的是复合,通俗来讲,就是has-a关系,在一个类里面有另一个类的对象。而委托类似于复合,在一个类中有另一个类的指针;稍复杂写的事继承,由继承,继而实现多态等等。

三大关系单独来看,基本用法都不难。但是,当我们通过继承,复合,委托所构成的类之间复杂的关系,来体会他们的用法,才发现其中的精妙。

侯老师通过设计模式的实例向我们展示了类与类之间精妙的设计,设计模式,侯老师讲起来好似轻描淡写很容易,但下来仔细体会却发现并非如此。学习是一个迭代的过程,这次笔记时并不能完全理解这几个设计模式的思想,但相信之后再学习的时候能有更深入的理解。

Adapter 模式

应用背景:假设我们有正在写的程序已经设计好了接口,我们想用第三方库来开发,但是我们程序中的接口与第三方提供的接口不一致。

这种情况下,我们不想修改自己的接口,更不可能去修改第三方早就写好的接口,这时候我们就需要一个中介--适配器。

进行这样的转换的设计,成为Adapter模式,结构图如下:

在我们现实生活中,也有很多适配器的例子,例如我们出国需要一个插孔的转换器,以便能给我们的电器充电。我们就借用这个例子来说明一下吧。

class Fsocket {

public:

void Fele() {

cout << "为外国电器充电" << endl;

}

~Fsocket() {}

};

首先,我们有一个国外的插座Fsocket,能提供“充电”这一服务

class Csocket

{

public:

virtual void ele() {

cout << "为中国电器充电" << endl;

}

virtual ~Csocket() {}

protected:

private:

};

然而,我们的中国电器只能用中国的插座(调用ele函数)来充电。我们需要的是为用户提供一个中国的插座Csocket,现在我们就需要一个将Fsocket转换为Csocket的Adapter:

class Adapter :public Csocket {//继承于Csocket

private:

Fsocket F;//内含一个Fsocket对象

public:

Adapter(const Fsocket& f) :F(f) {}

virtual void ele() {

F.Fele();

}

};

我们可以看到,Adapter内有一个Fsocket对象(这就是我们所说的复合关系),而Adapter继承于Csocket,当用户调用ele时,Adapter调用Fsocket的Fele供电,这样,我们就实现了接口的转换,在使用时,我们这样使用:

int main(int argc, char* argv[])

{

Fsocket f;

Csocket* a = new Adapter(f);//用现有的Fsocket去初始化一个Adapter

//但在用户看起来这是一个Csocket,可以为“中国电器充电”

a->ele();  //然后就可以使用“Csocket”的ele了

//但实际内部是一个Fsocket

return 0;

}

这样,通过Adapter,调用了Adaptee的功能,然而用户实际在使用的时候实际用的是我们所提供的接口,并不知道实际上我们使用的事第三方库的功能。

在Head First Disign Patterns 中,作者用幽默的例子向我们展现了上面所展现的关系:If it walks like a duck and quacks like a duck,then itmustmight be aduckturkey wrapped with a duck adapter...(如果它走起来像只鸭子,叫起来像只鸭子,那么他必定可能是一直鸭子包装了鸭子适配器的火鸡)

在 Adapter 模式的模式中,我们需要注意接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。Adapter模式中Adapter既继承了父类Target的接口,却又可继承Adaptee的实现(如果上面的例子不是用复合来实现而是用多重继承来实现的话,当然,这也只可能是在C++平台下),让我们细心体会这两个概念以及设计的理念。

在视频中,侯老师用标准库中queue的例子来说明,在queue中,queue复合了一个deque对象,然后功能完全用该deque对象的操作函数来完成,这可以说是一个Adapter模式的一个特例,我的理解,queue本身就是一个adapter,又是一个target提供给用户使用,并且这个adapter的作用其实是缩小deque的功能范围,提供部分接口给用户使用。

Adapter模式适用情况主要在接口不同的时候,所以我们在平时写程序时不能够滥用,设计模式除了理解它设计的思想之外还有一个难点,就在于你需要有能力判断在什么时候用才合适,这需要我们在充分理解的基础上进行实践练习的体会。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容