c++面向对象程序设计学习心得

首先介绍几个写类间关系和设计模式的技术博文

http://www.360doc.com/content/14/0613/21/18117192_386381321.shtml

http://blog.csdn.net/wuzhekai1985/article/details/6675799

http://www.cppblog.com/ming81/archive/2010/11/23/134404.html

状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。它有两种使用情况:(1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。本文的例子为第一种情况,以战争为例,假设一场战争需经历四个阶段:前期、中期、后期、结束。当战争处于不同的阶段,战争的行为是不一样的,也就说战争的行为取决于所处的阶段,而且随着时间的推进是动态变化的。下面给出相应的UML图

实现的代码比较简单,给出War类和State类,War类中含State对象(指针形式)。

 1 class War;
 2 class State
 3 {
 4 public:
 5     virtual void Prophase() {}
 6     virtual void Metaphase() {}
 7     virtual void Anaphase() {}
 8     virtual void End() {}
 9     virtual void CurrentState(War *war) {}
10 };
11 //战争
12 class War
13 {
14 private:
15     State *m_state;  //目前状态
16     int m_days;      //战争持续时间
17 public:
18     War(State *state): m_state(state), m_days(0) {}
19     ~War() { delete m_state; }
20     int GetDays() { return m_days; }
21     void SetDays(int days) { m_days = days; }
22     void SetState(State *

给出具体的状态类:

 1 [cpp] view plaincopyprint?
 2 //战争结束
 3 class EndState: public State
 4 {
 5 public:
 6     void End(War *war) //结束阶段的具体行为
 7     {
 8         cout<<"战争结束"<<endl;
 9     }
10     void CurrentState(War *war) { End(war); }
11 };
12 //后期
13 class AnaphaseState: public State
14 {
15 public:
16     void Anaphase(War *war) //后期的具体行为
17     {
18         if(war->GetDays() < 30)
19             cout<<"第"<<war->GetDays()<<"天:战争后期,双方拼死一搏"<<endl;
20         else
21         {
22             war->SetState(new EndState());
23             war->GetState();
24         }
25     }
26     void CurrentState(War *war) { Anaphase(war); }
27 };
28 //中期
29 class MetaphaseState: public State
30 {
31 public:
32     void Metaphase(War *war) //中期的具体行为
33     {
34         if(war->GetDays() < 20)
35             cout<<"第"<<war->GetDays()<<"天:战争中期,进入相持阶段,双发各有损耗"<<endl;
36         else
37         {
38             war->SetState(new AnaphaseState());
39             war->GetState();
40         }
41     }
42     void CurrentState(War *war) { Metaphase(war); }
43 };
44 //前期
45 class ProphaseState: public State
46 {
47 public:
48     void Prophase(War *war)  //前期的具体行为
49     {
50         if(war->GetDays() < 10)
51             cout<<"第"<<war->GetDays()<<"天:战争初期,双方你来我往,互相试探对方"<<endl;
52         else
53         {
54             war->SetState(new MetaphaseState());
55             war->GetState();
56         }
57     }
58     void CurrentState(War *war) { Prophase(war); }
59 };  

使用方式:

 1 int main()
 2 {
 3     War *war = new War(new ProphaseState());
 4     for(int i = 1; i < 40;i += 5)
 5     {
 6         war->SetDays(i);
 7         war->GetState();
 8     }
 9     delete war;
10     return 0;
11 }  

转:http://blog.csdn.net/wuzhekai1985/article/details/6660462

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下面一个个介绍,首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。有点抽象,举个例子就明白了。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核。客户需要什么样的处理器核,一定要显示地告诉生产工厂。下面给出一种实现方案。

 1 enum CTYPE {COREA, COREB};
 2 class SingleCore
 3 {
 4 public:
 5     virtual void Show() = 0;
 6 };
 7 //单核A
 8 class SingleCoreA: public SingleCore
 9 {
10 public:
11     void Show() { cout<<"SingleCore A"<<endl; }
12 };
13 //单核B
14 class SingleCoreB: public SingleCore
15 {
16 public:
17     void Show() { cout<<"SingleCore B"<<endl; }
18 };
19 //唯一的工厂,可以生产两种型号的处理器核,在内部判断
20 class Factory
21 {
22 public:
23     SingleCore* CreateSingleCore(enum CTYPE ctype)
24     {
25         if(ctype == COREA) //工厂内部判断
26             return new SingleCoreA(); //生产核A
27         else if(ctype == COREB)
28             return new SingleCoreB(); //生产核B
29         else
30             return NULL;
31     }
32 };  

这样设计的主要缺点之前也提到过,就是要增加新的核类型时,就需要修改工厂类。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

听起来很抽象,还是以刚才的例子解释。这家生产处理器核的产家赚了不少钱,于是决定再开设一个工厂专门用来生产B型号的单核,而原来的工厂专门用来生产A型号的单核。这时,客户要做的是找好工厂,比如要A型号的核,就找A工厂要;否则找B工厂要,不再需要告诉工厂具体要什么型号的处理器核了。下面给出一个实现方案。

 1 class SingleCore
 2 {
 3 public:
 4     virtual void Show() = 0;
 5 };
 6 //单核A
 7 class SingleCoreA: public SingleCore
 8 {
 9 public:
10     void Show() { cout<<"SingleCore A"<<endl; }
11 };
12 //单核B
13 class SingleCoreB: public SingleCore
14 {
15 public:
16     void Show() { cout<<"SingleCore B"<<endl; }
17 };
18 class Factory
19 {
20 public:
21     virtual SingleCore* CreateSingleCore() = 0;
22 };
23 //生产A核的工厂
24 class FactoryA: public Factory
25 {
26 public:
27     SingleCoreA* CreateSingleCore() { return new SingleCoreA; }
28 };
29 //生产B核的工厂
30 class FactoryB: public Factory
31 {
32 public:
33     SingleCoreB* CreateSingleCore() { return new SingleCoreB; }
34 };  

工厂方法模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,推出了很多新的处理器核,那么就要开设相应的新工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

既然有了简单工厂模式和工厂方法模式,为什么还要有抽象工厂模式呢?它到底有什么作用呢?还是举这个例子,这家公司的技术不断进步,不仅可以生产单核处理器,也能生产多核处理器。现在简单工厂模式和工厂方法模式都鞭长莫及。抽象工厂模式登场了。它的定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。具体这样应用,这家公司还是开设两个工厂,一个专门用来生产A型号的单核多核处理器,而另一个工厂专门用来生产B型号的单核多核处理器,下面给出实现的代码。

 1 //单核
 2 class SingleCore
 3 {
 4 public:
 5     virtual void Show() = 0;
 6 };
 7 class SingleCoreA: public SingleCore
 8 {
 9 public:
10     void Show() { cout<<"Single Core A"<<endl; }
11 };
12 class SingleCoreB :public SingleCore
13 {
14 public:
15     void Show() { cout<<"Single Core B"<<endl; }
16 };
17 //多核
18 class MultiCore
19 {
20 public:
21     virtual void Show() = 0;
22 };
23 class MultiCoreA : public MultiCore
24 {
25 public:
26     void Show() { cout<<"Multi Core A"<<endl; }
27
28 };
29 class MultiCoreB : public MultiCore
30 {
31 public:
32     void Show() { cout<<"Multi Core B"<<endl; }
33 };
34 //工厂
35 class CoreFactory
36 {
37 public:
38     virtual SingleCore* CreateSingleCore() = 0;
39     virtual MultiCore* CreateMultiCore() = 0;
40 };
41 //工厂A,专门用来生产A型号的处理器
42 class FactoryA :public CoreFactory
43 {
44 public:
45     SingleCore* CreateSingleCore() { return new SingleCoreA(); }
46     MultiCore* CreateMultiCore() { return new MultiCoreA(); }
47 };
48 //工厂B,专门用来生产B型号的处理器
49 class FactoryB : public CoreFactory
50 {
51 public:
52     SingleCore* CreateSingleCore() { return new SingleCoreB(); }
53     MultiCore* CreateMultiCore() { return new MultiCoreB(); }
54 }; 

c++面向对象程序设计学习心得

时间: 2024-10-24 13:09:12

c++面向对象程序设计学习心得的相关文章

面向对象程序设计学习日记

面向对象程序设计学习日记 持续更新(可能),更新时间不限,催更不管,腰斩就跑(逃-) Date:2018.5.1(Elevator_V1.1) 前言 五一节每年都过得相当委屈,全国劳动者放假,学生虽然跟着放假却因为劳动者都不足,不少服务不是暂停就是加价,所以放假也只能老实呆在家里宅着. 但是!今年五一节是我这一生过得最憋屈的一次,QQ列表里的人几乎全去玩了,就我一个没人约,孤独的宅在家里刷空间??然而打开空间就又是一股满满的现充之风铺面而来,还给不给死宅留条活路了(心碎.jpg). 五一没人约,

面向对象程序设计学习进度条

面向对象程序设计学习进度条 周次 (阅读/编写)代码行数 发布博客量/博客评论数量 课堂/课余学习时间(小时) 最满意的编程任务 第一周 100/40 1/0 6/4 九九乘法表 第二周 150/80 1/0 6/4 实验3.实验7 第三周         第四周         第五周         第六周         第七周         第八周         第九周         第十周         第十一周         第十二周         第十三周      

C语言程序设计学习心得

一,思维导图 二,语法认识 1,if-else的用法 if (条件一) { 语句一; } else { 语句二; } 问题:else与if的匹配关系不明确,导致程序异常. 解决方法:牢记else与离其最近的一个if配对,不与其他的if连用,并规范代码书写格式,使其看起来跟加清晰明了. 2,while语句的用法 while (循环条件) { 循环语句; } 注意事项:while比较好用,基本上所有的循环结构都能用while写. 3,for语句的用法 for(表达式1; 表达式2; 表达式3) {

面向对象程序设计lesson2心得体会

第二节课我们主要学习了接口和IO操作.接口可以看作一个纯的抽象类,只提供设计,不提供方法实现.接口中可以包含基本数据类型,默认为static和final.接口可以允许在几个不相干的对象中定义共同的行为.声明接口时使用[接口修饰符] interface 接口名称 [extends 父接口名].接口中所有方法自动地属于public.在实现接口时,要使用implements,来自接口的方法必须要声明为puublic.还可以实现多个接口 implements 接口1 接口2.接口也可以继承,与继承类不同

2017面向对象程序设计(Java)第二周学习总结

2017面向对象程序设计(Java)第二周学习总结 直系学妹学弟们好!额...不要问我为什么把学妹放前面,我也不知道!我只是你们和蔼可亲的学长一枚而已.也不要问为什么是第二周学习总结而不是第一周,因为第一周学长正在家里吃西瓜吹空调.好了,闲言少叙.我先为你们介绍一下助教的职责,而后再对你们的学习情况进行总结! 身为你们本学期Java课程的助教...之一,我的任务是:指导你们学习,批改我所负责学习小组的实验作业.阅读博文并回复.其他学习小组会有另外三位助教负责.由于我们每周五都会汇总你们的情况,其

201671010117 2016-2017-2 《Java程序设计》Java第三周学习心得

Java第三周学习心得 通过这一周的学习,了解到了Java的核心部分,理解了用户自定义类的定义 ,了解了对象的声明 ,了解了使用构造函数初始化对象 ,使用类属性与方法的使用,了解了package和import语句的用途,知道了假设你面对现实世界的一个对象,你不会把它的属性和处理方法分开,程序设计也是一样.面向对象程序设计(OOP):一种新的思维方法,更接近人类处理现实世界问题的自然表示方法.面向对象的语言有:C++,Smalltalk,Java等.面向对象程序设计的几个主要概念:抽象数据类型.类

201671010105 2016-2017-2《Java程序设计》第一、第二章学习心得

我们大一的时候学习的是C语言程序设计,C语言是面向程序的,而老师也说过我们后面会学习一种面向对象的程序设计语言--Java程序设计,而在二年级开学第一周,我们第一次真正意义上接触到了它. 令人意外的是和往常老师讲学生听不同,这一周我们对Java程序设计第一.第二章的学习完全是自主的,通过一周对Java第一.第二章的学习,心得体会如下: 第一章 Java程序设计概述 1.通过对第一章的学习,对Java有了比较深入的了解,Java和C一样,是一种语言,但它又不止是一种语言,它是一个完整的程序设计平台

杨玲 徐思 《面向对象程序设计(java)》第十一周学习总结

<面向对象程序设计(java)>第十一周学习总结 第一部分:理论知识学习部分 1.一般将数据结构分为两大类:线性数据结构和非线性数据结构.线性数据结构:线性表.栈.队列.串.数组和文件.非线性数据结构:树和图.2.线性表按其存储结构可分为顺序表和链表:用顺序存储结构存储的线性表称为顺序表:顺序表将线性表中的数据元素依次存放在某个存储区域中.一维数组就是用顺序方式存储的线性表.用链式存储结构存储的线性表称为链表.3.栈(Stack)也是一种特殊的线性表,是一种后进先出 (LIFO)的结构.栈是限

徐思201771010132 《面向对象程序设计(java)》课程学习总结

1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: (5) 综合编程练习. 2.实验内容和步骤 任务1:填写课程课后调查问卷,网址:https://www.wjx.cn/jq/33108969.aspx. 任务2:综合编程练习 练习1:设计一个用户信息采集程序,要求如下: (1)  用户信息输入界面如下图所示: (1)用户点击提交按钮时,用户输入信息