dxxds
【教】明明人家才是最萌的设计模式(10.27更新)

本帖最后由 dxxds 于 2013-10-27 10:55 编辑

自从第一个教程帖完结后,就偷懒没再发第二贴了。原因也是有的,其中最大的原因就是因为…… 因为空撸伤身什么的造成我一直没有再发新帖。

当然这次发了,也并不是说我就有了,我依然没有。你们是想说我有基友了么?#16t 你们!你们实在是!是!太!了解我了!

嗯,好基友也是没有的。

好了,先复习一下之前学过的一个内容吧:继承。

就是在情人节的那天,用一个父类指针创建一个子类对象,当然,这个父亲有好几个孩子,他可以随便选则是自己变成哪一个,或者轮着变一圈,然后……

这就是策略啊策略!别说我无耻啊!这设计模式里就是这么写的!

然后就上来我们今天的第一课内容了:策略模式!

是有人想问我为啥不是从工厂模式开始讲?别的书都是从这个开始的……

切!库达拉那医 …… 那样不就显得我很不专业么,显得我是抄他们的了么?所以我换一个。

这个策略模式,就是说会随着环境的变化,自己的策略也会有相应的变化。之前继承的课程里就用策略模式

今天出门

如果晴天,就去拿棒棒糖换萝莉。

如果是阴天,就去基友家撸PSP。

如果是下雪天,就自己撸代码。

先上这个熟悉的代码模板

#include *本站禁止HTML标签噢*

using namespace std;

int main()

{

return 0;

}

默认编译环境是WIN下的C-FREE和VS2005以上。(C-FREE好像用的就是我的VS编译器…… 主要是我的DEVCPP很严重的坏了,然后我又懒的修复…… 想来这点基础C++,语法应该都是一样的)

然后在这个基础上,添加一个纯洁的父亲类

class I_evil //纯洁类 I表示interface

{

public:

I_evil(void){}; //构造函数,用来创造纯洁

virtual ~I_evil(void){}; //析构函数,当然是删除纯洁

virtual void strategy(void)=0; //虚函数,执行那纯洁的策略

};

然后我们来写这第一个策略

class C_sunshine : public I_evil //公有方式继承父类,为什么公有,因为好用

{

public:

C_sunshine(){};

~C_sunshine(){}; //是虚的,不过virtual可以不用写

void strategy(void) //也是虚的,virtual写不写都一样,一般要写,因为整齐,可读性好

{

cout<<"去拿棒棒糖换萝莉"<<endl;

}

};

注释写的很清楚了,我就接着写第二第三个了

class C_cloudy : public I_evil //第二个策略,继承纯洁

{

public:

C_cloudy(){};

~C_cloudy(){};

void strategy(void)

{

cout<<"去基友家撸PSP"<<endl;

}

};

class C_snow : public I_evil //第三个策略

{

public:

C_snow(){};

~C_snow(){};

void strategy(void)

{

cout<<"独自撸代码"<<endl;

}

};

然后就该执行了

int main()

{

I_evil* Evil_Father = NULL; //一个纯洁的爸爸,main函数里,全程就只有这一个变量

cout<<"第一天,晴天"<<endl; //第一天开始了

Evil_Father = new C_sunshine;

Evil_Father->strategy();

delete Evil_Father; //第一天结束了

cout<<"第二天,下雪"<<endl; //第二天来了

Evil_Father = new C_snow;

Evil_Father->strategy();

delete Evil_Father; //第二天过去了

cout<<"最后一天,阴天"<<endl; //第三天也来了

Evil_Father = new C_cloudy;

Evil_Father->strategy();

delete Evil_Father; //第三天结束了

system("pause>nul"); // stdlib.h 或者 cstdlib

return 0;

}

今天开斋节,小放假

内容简单易懂,看完回一下这个好帖子。

当然,不懂的就更要回一下这个0售价的好帖子了啊!!

初音未来の忧郁
终于更新了
展开Biu

终于更新了T_T好感动,低产啊~

[查看全文]
dxxds
本帖最后由
展开Biu

本帖最后由 dxxds 于 2013-10-28 21:56 编辑

作为一个近几个月不咋上网不咋看电视不咋读报纸甚至连小说都断了的不知道虔不虔诚的IT男来说,我

的行迹已经完全说明了一个问题 —— 那就是忙,啊,那就是忙。

每天都有加班,倒是也不是很晚,8,9点吧,但是一个小时回家后,也就,9,10点了,再吃个饭,撸个

管,也就可以去睡了。

像我这种没有在自己是学生时期,长相甜美的时候还没有找个女朋友,就毅然决定寻找梦想,远走他乡

,要一手扛起生活,一手扛起性生活的人,的确是很苦闷的。

我现在会尽可能的让自己的帖子更的快一点,虽然没啥人跟吧。

个人感觉,设计模式里很重要又很常用的,可能是单例模式,概念简短易懂的,可能是观察者模式,所

以我们今天就来聊聊,工厂模式。

工厂模式算是大多设计模式中的标准 hello world 开场了

还是从它开始

#include *本站禁止HTML标签噢*

using namespace std;

int main()

{

return 0;

}

鉴于之前的策略模式和代理模式,都很适合与工厂模式结合。

所以我就打算,不用它们,直接用最简短的代码直接赤果果的讲解工厂。

绝对是简短的,要相信我,不用最精髓的意思来讲解代码,我都不好意思说我曾经的志向就是想当教授

啊。啊,错了,是老师

现在放出这节课最重要的代码,然后后面的长代码都是围绕这个逻辑进行包装的。

int* create_int(const int a = 2) // 造一个符合你的吉利的数字,默认是二

{

return new int(a);

}

int main()

{

int* pa = NULL; //首先,来个指针

pa = create_int(); //然后,调用工厂方法,不填参数的话,你就是二。

cout<< *pa <<endl; //之后,看看工厂造了个啥,目前造了个二

delete pa; //最后,过河拆桥

system("pause");

return 0;

}

这个造二的逻辑,就是工厂模式中的最主要功能了

看一下要用到的类

I_unit // 单位,主接口

C_tank // 坦克 继承 I_unit

C_plane // 飞机 继承 I_unit

I_factory // 工厂,主接口

C_factory_tank // 造坦克的工厂 继承 I_factory

C_factory_plane // 造飞机的工厂 继承 I_factory

预习到此为止,现在我们来玩真的,上代码

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

using namespace std;

class I_unit

{

public:

virtual ~I_unit(){} // 虚析构,这样子类可以调用自己的析构来结束自己的

一生

virtual void who_am_i() = 0;

};

class C_tank : public I_unit

{

public:

void who_am_i()

{

cout<<"我是舒克"<<endl;

}

};

class C_plane : public I_unit

{

public:

void who_am_i()

{

cout<<"我是贝塔"<<endl;

}

};

// 以上是产品 以下是工厂 虽然不是第一次发 但我不会割

class I_factory

{

public:

virtual ~I_factory(){}

virtual I_unit* create_unit() = 0;

};

class C_factory_tank : public I_factory

{

public:

I_unit* create_unit()

{

return new C_tank;

}

};

class C_factory_plane : public I_factory

{

public:

I_unit* create_unit()

{

return new C_plane;

}

};

// 以上是所有类 以下是调用

void build_tanks()

{

I_factory* tank_factory = NULL; // 一个工厂

I_unit* tank = NULL; // 一个产品

tank_factory = new C_factory_tank;

tank = tank_factory->create_unit();

tank->who_am_i(); // 不出意外的话,这货应该是坦克

delete tank;

delete tank_factory;

}

void build_planes()

{

I_factory* plane_factory = NULL; // 一个工厂

I_unit* plane = NULL; // 一个产品

plane_factory = new C_factory_plane;

plane = plane_factory->create_unit();

plane->who_am_i(); // 不出意外的话,这货应该是灰机

delete plane;

delete plane_factory;

}

// 以上为全部准备工作,以下正式耍

int main()

{

build_tanks();

build_planes();

system("pause");

return 0;

}

就这样,我忙了

[查看全文]
魔王猫
果然是最萌
展开Biu

果然是最萌~~~~

[查看全文]
u-somepig
就凭卤煮死的上亿脑细胞
展开Biu

就凭卤煮死的上亿脑细胞,也得回帖啊

[查看全文]
loiyohong
好腻害啊
展开Biu

好腻害啊!!

#5x

[查看全文]
dxxds
如果代码能够高亮就更好了
展开Biu

GRzhan 发表于 2013-8-13 22:33

如果代码能够高亮就更好了

我看看怎么弄的

[查看全文]
GRzhan
如果代码能够高亮就更好了
展开Biu

如果代码能够高亮就更好了=978=

[查看全文]
dxxds
太有爱了
展开Biu

TB炭 发表于 2013-8-11 23:07

太有爱了

就是喜欢卖萌的代码2333

萌是卖了,可有领悟?

你要看懂我才好接着卖

[查看全文]