文档章节

24种设计模式学习记录第二篇

没有脚的大笨鸟
 没有脚的大笨鸟
发布于 2014/03/30 10:58
字数 1554
阅读 34
收藏 0

既然用了面向对象的程序设计语言,就要充分利用OO的三大特性:封装、继承、多态。大概说下这三个特性:

一.封装<数据保护>

    从字面意思上可以理解把一些东西封装起来,这里要封装的东西就是所谓的方法和属性。这样每个对象都包含它能进行操作所需要的所有信息,不必信赖其他对象来完成自己的操作。打个形象的比喻:我们的房子就是一个类的实例,室内的装饰与摆设只能被室内的居住者欣赏和使用,如果没有四面墙的遮挡,室内的所有活动在外人面前一览无遗。由于有了封装,房屋内的所有摆设都可以随意地改变而不影响他人。然而,如果没有门窗,一个包裹严实的黑箱子即使再广阔也没有实用价值。房屋的门窗,就是封装对象暴露在外的属性和方法,专门供人进出以及流通空气带来阳光。

    封装的好处:1,良好的封装能够减少耦合;2,类内部的实现可以自由的修改而不会影响外部的使用;3,类具有清晰的对外接口。

二.继承<代码复用>

    这个从字面意思也是很好理解,继承财产什么的,继承就意味着可以得到很多长辈的东西嘛。对象的继承是一种IS-A的关系,如果两个对象A和B,可以描述为'B是A,那么B可以继承A'(其实我一开始也糊涂什么是isa,我现在的理解是用这样一句英语:cat is a animal.)猫是哺乳动物,就说明了猫与哺乳动物之间继承与被继承的关系。实际上,继承者可以完全被被继承者,反之则不成立。所以,我们在描述继承的IS-A关系时,是不能相互颠倒的。继承定义了如何相互关联,共享特性。继承的工作方式是,定义父类和子类或叫基类和派生类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。如果子类继承于父类,第一、子类拥有父类非private的属性和功能(从生物角度来说,你有些地方长的必然像父亲);第二、子类具有自己的属性和功能,可以扩展父类没有的(由于基因问题,可能有些地方和父亲不同);第三、子类还可以以自己的方式实现父类的功能,这就是所谓的方法重写,是一种接口复用(父子俩都会吃饭,但是你不喜欢父亲吃饭的方式的话,可以选择一种你喜欢的吃饭方式)。

        继承的好处:使的所有子类的公共部分都聚焦在父类,代码得到共享,避免了重复;另外,继承使得修改和扩展都变得容易。当然这也增加了耦合度,所以只有在两个类具备isa关系时才考虑用继承~

三.多态(利用指针的静态类型和动态类型可以不一致这个原理)

多态表示不同的对象可以执行相同的动作,但是通过它们自己的实现代码来执行。举个例子说明,假设有这样一对父子,父亲是非常有名的京剧艺术家,儿子也一直跟父亲学习,将来有一天子继父业。有一天,父亲突然生病无法上台,但是票都卖出去了,只有让儿子代替父亲去表演,反正化妆之后他娘估计也认不出,结果上台之后表演不比父亲差,很成功。但是看戏的人没看出什么差别。强调几点:1.在这里子类以父类的身份出现,儿子代表老子表演,以父亲的身份出现;(我说这句话的时候是不是想起了老师们经常强调的一句话?好吧,上课补充了我的睡眠而不是知识~ 实现多态的俩个条件:一个是virtual关键字,另一个就是指向子类对象的基类指针,这里就是基类指针)2.子类在工作时以自己的方式来实现,儿子模仿的再好也是模仿,儿子只能用自己理解的表现方式去模仿父亲的作品(这里就是说实际指向的是子类对象);3.子类以父类的身份出现时,子类特有的属性和方法不可使用(否则还不露出马脚~)儿子经过多年的学习,其实已经有了自己的创作,自己人的绝活,但在此时,代表父亲表演时,绝活是不能表现出来的。当然,如果父亲还有别的儿子会表演,也可以代表父亲去表演的话道理也是一样的。

   刚才说了实现多态的俩个条件:一个是virtual关键字,另一个就是指向子类对象的基类指针。多态的原理是当方法被调用时,无论对象是否被被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用,即虚方法是按照其运行时的类型而非编译时类型进行动态绑定调用的。


以上就是OO特性的简单介绍,下面是修改的第一个版本

#include<iostream>

using namespace std;

class Operator{
public:
	double GetResult(double num1,double num2,char op)
	{
		double result = 0;
		switch(op)
		{
			case '+':
				result = num1 + num2;
				break;
			case '-':
				result = num1 - num2;
				break;
			case '*':
				result = num1 * num2;
				break;
			case '/':
				result = num1 / num2;
				break;
		}
		return result;
	}
};

int main(void)
{
	int num1,num2;
	char op;
	Operator cal;

	cout << "please input num1" << endl;
	cin  >> num1;
	cout << "please input num2" << endl;
	cin  >> num2;
	cout << "please input the operator" << endl;
	cin >> op;
	cout << num1 << " " << op << " "  << num2 << " " << "=" << " ";
	cout << cal.GetResult(num1,num2,op) << endl;

	return 0;

}







© 著作权归作者所有

共有 人打赏支持
没有脚的大笨鸟
粉丝 5
博文 11
码字总数 5230
作品 0
浦东
程序员
设计模式之禅(第2版).epub

【下载地址】 本书是设计模式领域公认的3本经典著作之一,“极具趣味,容易理解,但讲解又极为严谨和透彻”是本书的写作风格和方法的最大特点。第1版2010年出版,畅销至今,广受好评,是该领...

winter730
05/16
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127
2017/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可爱的python测试开发库(python测试开发工具库汇总)

欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 相关书籍下载 测试开发 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装。 链接 selenium - web UI自动化测试。 链...

python测试开发人工智能安全
今天
2
0
Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部