有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 2361|回复: 43
收起左侧

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

[复制链接]

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
发表于 2013-8-8 16:13:34 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

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

    自从第一个教程帖完结后,就偷懒没再发第二贴了。原因也是有的,其中最大的原因就是因为…… 因为空撸伤身什么的造成我一直没有再发新帖。
    当然这次发了,也并不是说我就有了,我依然没有。你们是想说我有基友了么? 你们!你们实在是!是!太!了解我了!
    嗯,好基友也是没有的。

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

    就是在情人节的那天,用一个父类指针创建一个子类对象,当然,这个父亲有好几个孩子,他可以随便选则是自己变成哪一个,或者轮着变一圈,然后……
    这就是策略啊策略!别说我无耻啊!这设计模式里就是这么写的!

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

    是有人想问我为啥不是从工厂模式开始讲?别的书都是从这个开始的……
切!库达拉那医 …… 那样不就显得我很不专业么,显得我是抄他们的了么?所以我换一个。

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

今天出门
如果晴天,就去拿棒棒糖换萝莉。
如果是阴天,就去基友家撸PSP。
如果是下雪天,就自己撸代码。

先上这个熟悉的代码模板

#include<iostream>
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售价的好帖子了啊!!

评分

参与人数 3宅魂 +2 宅币 +33 贡献 +2 活跃 +1 收起 理由
张小斌~~ + 3 Σ( ° △ °|||)︴ 碉堡了
风音洛洛 + 25 + 2 Σ( ° △ °|||)︴ 标识符泥垢了
kiyouka + 2 + 5 + 1 o(* ̄▽ ̄*)ブ 辛苦 辛苦~

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-8-10 21:14:35 | 显示全部楼层
本帖最后由 dxxds 于 2013-8-13 22:57 编辑

最萌的设计模式2

    八月生死两茫茫,不思量,自难忘。
    又到了一年一度用40度的立秋给大家卖萌的时候了。
    走在立秋的路上,心中唱着立秋的歌(修辞而已),我感觉我慢慢的回到秋天,区区40度而已,完全没有感觉到好像身边一直有个大火炉在跟着我,或者全市就是一个桑拿房的感觉,立秋真好,倍感凉爽。

    以上就是一个完全不懂二十四节气的宅男,在出去找基友连PSP时路上的感觉,十分美妙,建议大家都好好领会一下此段文章所传达出来的精神和内涵。
    不要跟我提什么文采不文采的,我的语文从小学开始就慢慢的摆脱了不及格,到了高中才又慢慢的回到了不及格而已,且不说我最得意的学科是美术课,就单单拎出一定能考到及格线附近的体育课就能吓死你们。
   
    看到了一直在前进的我,你们为自己懈怠的生活汗颜了吧。于是乎,就由最萌的DXXDS来带领你们继续前进

    策略模式的进阶:代理模式

    今天的代码从这开始

#include<iostream>
using namespace std;

int main()
{
   return 0;
}


这次的内容相较于之前的内容,更加简单(前提是前一课完全看懂)
就是在前一课的基础上,增加了一个代理类,剩下的都一样,那就来吧

class I_evil            //上节课的纯洁
{
   I_evil(void);
   virtual  ~I_evil(void);
   virtual strategy(void)=0;
};

class C_sunshine : public I_evil  //上节课的晴天策略
{
public:
   C_sunshine(){};
   ~C_sunshine(){};
   void strategy(void)
   {
      cout<<"去拿棒棒糖换萝莉"<<endl<<endl;
   }
};

class C_cloudy : public I_evil  //上节课的阴天策略
{
public:
   C_cloudy(){};
   ~C_cloudy(){};
   void strategy(void)            
   {
      cout<<"去基友家撸PSP"<<endl<<endl;
   }
};

class C_snow : public I_evil  //雪天策略,一个字儿也没改
{
public:
   C_snow(){};
   ~C_snow(){};
   void strategy(void)            
   {
      cout<<"独自撸代码"<<endl<<endl;
   }
};


然后咱们这节课的内容就开始了。
假设现在有一个代理机器人,你问它:“今儿晴天,干啥最可能掉节操?"
然后这个代理机器人在经过了一阵疯狂的运算后,告诉你了今天可能最掉节操的运势

class C_proxy_evil : public I_evil    //代理类,代理机器人,代理方法?叫什么都行。反正全程就用这个类产生的对象演示结果
{
public:
   C_proxy_evil(I_evil* evil): m_evil(evil){}    //复制构造函数,用来复制下面纯洁的策略,
   ~C_proxy_evil()                                //别忘了在这里要删除复制来的纯洁的策略
   {
      delete m_evil;
   }
   void strategy(void)                        //最掉节操的事儿
   {
      this->m_evil->strategy();
   }
private:
   I_evil* m_evil;                               //纯洁父亲类的可变身成员变量/对象,必须是指针类型
};


现在这节课的内容就结束了。
- -
下面开始展示结果。

然后这里是展示纯洁用的函数

//下面封装一下,这样可以看的更清楚,顺便洗清我偷懒的嫌疑

void if_sunshine()              //如果晴天,你就去拿棒棒糖换萝莉。
{
   cout<<"今天是晴天"<<endl;        //吼吼~ 晴天哦~
   I_evil* proxy = new C_proxy_evil(new C_sunshine);
   proxy->strategy();
   delete proxy;
}

void if_cloudy()              //如果是阴天,你就去基友家撸PSP。
{
   cout<<"今天是阴天"<<endl;        //阴天了……
   I_evil* proxy = new C_proxy_evil(new C_cloudy);
   proxy->strategy();
   delete proxy;
}

void if_snow()                  //如果是下雪天,你就自己撸代码。
{
   cout<<"今天是下雪天"<<endl;        //可惜,下雪了
   I_evil* proxy = new C_proxy_evil(new C_snow);
   proxy->strategy();
   delete proxy;
}


现在正式开始

int main()
{
   if_sunshine();     //这里是我也不知道该写点啥的注释
   if_snow();
   if_cloudy();

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

有不懂的地方,就看第一课,还不懂就问我。
玩游戏去了。
   

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-10-27 10:55:25 | 显示全部楼层
本帖最后由 dxxds 于 2013-10-28 21:56 编辑

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

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

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

管,也就可以去睡了。

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

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



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

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

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

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

还是从它开始

#include<iostream>
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 <iostream>
#include <cstdlib>

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;
}


就这样,我忙了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

37

好友

1万

积分

第一章

积分
18487
发表于 2013-8-8 18:07:08 | 显示全部楼层

弱渣正纠结于网络流……
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

233

主题

114

好友

2万

积分

第一章

积分
20564
发表于 2013-8-8 20:06:24 | 显示全部楼层
好萌的帖子!
这是芥末的计算姬基友群
121666938
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

50

好友

5293

积分

序章

积分
5293
发表于 2013-8-8 21:04:20 | 显示全部楼层
建议您发教程之前先自己编译下
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-8-8 23:31:52 | 显示全部楼层
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

50

好友

5293

积分

序章

积分
5293
发表于 2013-8-9 00:11:39 | 显示全部楼层
virtual strategy(void)=0;

还有这里
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-8-9 07:24:37 | 显示全部楼层
jingyixx 发表于 2013-8-9 00:11
virtual strategy(void)=0;

还有这里

这里怎么了?
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

9

好友

1228

积分

Continue

积分
1228
发表于 2013-8-9 07:48:53 | 显示全部楼层
各种头疼各种晕的终于把第一帖撸完了...LZ太强大了..继续努力哈!!
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

50

好友

5293

积分

序章

积分
5293
发表于 2013-8-9 09:19:54 | 显示全部楼层

不能编译
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-8-9 09:29:29 | 显示全部楼层

提示錯誤是什麽?

我已經用C-FREE和VS編譯通過了。

能自己排除么?
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

50

好友

5293

积分

序章

积分
5293
发表于 2013-8-9 09:45:30 | 显示全部楼层
dxxds 发表于 2013-8-9 09:29
提示錯誤是什麽?

我已經用C-FREE和VS編譯通過了。

……因为你没写函数类型
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-8-9 09:50:50 | 显示全部楼层
jingyixx 发表于 2013-8-9 09:45
……因为你没写函数类型

……

你就當我賣了個萌
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

21

好友

6174

积分

序章

积分
6174
 楼主| 发表于 2013-8-9 21:04:52 | 显示全部楼层
@kiyouka   
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

51

好友

1万

积分

第一章

积分
13669
发表于 2013-8-10 08:45:23 | 显示全部楼层

滚进来了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(基宅) ( 粤ICP备18082987号-1 | 浙公网安备 33010902001746号 )

GMT+8, 2024-5-6 17:27 , Processed in 0.278649 second(s), 33 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表