文档章节

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

没有脚的大笨鸟
 没有脚的大笨鸟
发布于 2014/03/30 10:58
字数 1554
阅读 34
收藏 0
点赞 0
评论 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

系统架构技能之设计模式-单件模式

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

wbf961127 ⋅ 2017/11/12 ⋅ 0

C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

js策略模式《JavaScript设计模式与开发实践》阅读笔记

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换。 策略模式可以避免代码中的多重判断条件。 策略模式很好的体现了开放-封闭原则,将一个个算法(解决方...

RoyLuo ⋅ 05/19 ⋅ 0

[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空 ⋅ 2015/06/03 ⋅ 0

简单工厂模式,工厂模式和抽象工厂的区别

转载自:http://ichennan.com/2016/08/09/DesignPattern.html 简单工厂模式 简单工厂模式不是23种里的一种,简而言之,就是有一个专门生产某个产品的类。 比如下图中的鼠标工厂,专业生产鼠标...

yanshuanche3765 ⋅ 03/07 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

Android 架构师7 设计模式之观察者模式

前言 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 观察者模式 被观察者,即主题角...

zhang_pan ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 20分钟前 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 23分钟前 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 23分钟前 ⋅ 0

IT行业的变革就像世界杯德国对战墨西哥一样难以预测[图]

最近在观看世界杯,尤其是昨天的比赛,上一届卫冕冠军德国队居然0:1告负墨西哥,这创造了历史,首先是墨西哥从来没赢过德国队,其次是德国队36年来首站没输过,再差也是打平,而这次,德国队...

原创小博客 ⋅ 42分钟前 ⋅ 0

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 52分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部