设计模式是用来弥补面向对象编程缺陷的方法总结

面向对象和设计模式都是大家耳熟能详的概念。面向对象是以对象为基本元素,对数据与逻辑行为进行封装。实现面向对象过程的方法是使用抽象,同时在使用抽象进行分析设计的时候就产生了类型,并隔离了抽象与实现。这个过程是有很多的优点的,熟话说得好,完美的东西肯定也有不足。因此我们这里要讨论的是面向对象的缺点,以及设计模式就是用来弥补这些缺陷的方法总结。

 

抽象是特殊到一般的过程。在这个过程中会忽略对象的个性而归纳出共性。不过对象实例在行为上不仅仅有共性,还有一些自己的特性。如何继承共性,保持自己的个性也一直是面向对象编程需要实际结局的问题。

 

抽象是灵丹也带来如何创建具体实现的问题

面向对象使得对象有抽象与实现之分,并在实现中变化,而用抽象来应对变化(也就是抽象是不变这个假设)。首先实现有不同的具体实现,那么在运行时候需要采用哪种手段呢?在面向对象理论里面我没有找到与之对应的方法,反而在设计模式-创建型的模式里面比如抽象工厂等中找到创建产品具体实现。

 

对象类型带来的苦恼

由于抽象,对象实例与对象类型以及对象类型之上的泛型化的对象类型,产生了很多的对象类型层次。所以在实现的过程中需要判断具体的对象类型,根据具体的对象类型来调用相应的操作。而且这在C++里面还有一种专门的RTTI-也就是动态类型诊断技术。在C#里面运行时CLR里面也有TypeChecker这个组件。这种需要判断类型来进行交互的逻辑实现在对象理论里面也没有具体的方法。虽然多态方法能根据运行时的类型来动态决定那个具体的函数被调用,但是总是有些地方的逻辑是需要类型判断的。所以设计模式里面就有了相应的一些模式来弥补面向对象的不足。比如说每种对象类型都都封装自己的处理逻辑,然后借助反射来实现客户端与具体类型的解耦。

 

对象实例如何体现个性

对象实例是对象在运行时态的一个视图,由于我们使用面向对象的继承机制,所以往往看到的是对象的共性,而很少有个性。而且经常在使用继承的时候会犯一个不是错误的错误,那就是子类否决父类的方法(我不知道怎么表达这个意思比较好,就是一种子类型的行为不符合父类的行为,也就是违反经典的里氏替换原则)。客户端如何调用对象的个性呢?是向下转型成我们的子类型还是使用转换成行为接口呢?面向对象同样也没有解决方法,而设计模式之一的Visitor模式就很好解决了这个问题。这个时候客户端作为一个Vistor的实现去访问Vistable的子类,Vistable子类同样调用客户端Visitor,使得成为双向调用来解决子类个性行为问题。

 

以上基本总结了由于抽象所带来的问题(个性与共性问题,对象类型层次),以及设计模式如何解决这里问题的方案。所以我们不能为了面向对象而面向对象。实际上面向对象与面向结构的各自的问题也是导致Linus C与C++争论的焦点问题的根源。

转载于:https://www.cnblogs.com/zengyongjoy/archive/2010/06/30/1768732.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

navicat的安装

1.下载 这里使用的是11.1版本。 2.安装到D盘 3.破解 下载 参考:http://www.cnblogs.com/da19951208/p/6403607.html 将PatchNavicat粘贴到安装目录,然后双击 选择navicat、 结果: 4.这个时候可以使用了 转载于:https://www.cnblogs.com/junca…

docker实现宿主机和容器之间映射添加数据卷

docker run -it —privilegedtrue -v /宿主机绝对路径:/容器内目录 镜像名 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷 在ubuntu容器内 /tmp/docker_data 下新建test.txt文件 在宿主机…

实验四 恶意代码

中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验四 恶意代码技术 学生姓名 冷其航 年级 14级 区队 二区队 指导教师 高见老师 信息技术与网络安全学院 2017年10月24日 实验任务总纲 2017—2018 学年 第 一 学期 一、实验…

Linux系统删掉多个文件

rm -f 2010-10-*.log转载于:https://www.cnblogs.com/dpf-learn/p/7752952.html

docker启动容器指定端口和随机分配端口

例子 我要启动tomcat docker run -d -P tomcat 大些-P表示随机分配端口 docker run -d -p 8086:8080 tomcat 小些-p 表示指定端口,主机端口:docker容器端口

华为 思科 配置

华为路由器交换机配置命令:计算机命令 PCAlogin:root;使用root用户 password:linux;口令是linux #shutdown-hnow;关机 #init0;关机 #logout;用户注销 #login;用户登录 #ifconfig;显示…

Windows 7 下IIS 7.5 结合Zend构建PHP集成开发环境

Windows 7 下IIS 7.5 结合Zend构建PHP集成开发环境 作者:宋杨日期:2010年7月4日星期日FeedBack:songyangsongyang.me系统环境:Windows 7 简体中文旗舰版软件环境:1、 IIS 7.5(安装FastCGI)2、 Z…

在docker安装完tomcat后,访问地址出现404错误

在docker安装完tomcat后,访问地址出现404错误 可以看到我们平时访问的文件在webapps文件夹下,而这里的这个文件夹却为空,因为他把文件都放在webapps.dist文件夹下了,所有你只需要把webapps文件夹里面的内容移到webapps里面即可 …

czy的后宫5

题目描述 Description \(czy\) 要召集他的妹子,但是由于条件有限,可能每个妹子不能都去,但每个妹子都有一个美丽值,\(czy\) 希望来的妹子们的美丽值总和最大(虽然……)。\(czy\) 有一个周密的电话通知网络&…

解决Use ‘docker scan‘ to run Snyk tests against images to find vulnerabilities and learn how to fix th

Use docker scan to run Snyk tests against images to find vulnerabilities and learn how to fix them 解决方案 执行如下命令 export DOCKER_SCAN_SUGGESTfalse

上传附件删除、session清空问题

最近因为项目的需要,将客户端附件上传至服务器,附件上传的位置是IIS目录下的文件夹,经过处理之后。必须将该附件删除。 程序发布之后,使用该功能,结果项目无法运行。必须要重新启动IIS才可以重新运行整个项目。因为项目中的Sessio…

浅谈Junit4和TestNG中的参数化测试

最近在看Junit4的相关知识,由于本身做的是自动化方面的测试,所以工作上着重于应用TestNG。恰好遇到了一个将case进行参数化的需求,故在此记录Junit4和TestNG在参数化方面的区别。 一、Junit4和TestNG的注释支持 特点JUnit 4TestNG测试注释Tes…

使用docker查看和删除虚悬镜像

虚悬镜像是REPOSITORY和TAG为<none>的镜像 none镜像(虚悬镜像),那是因为 构建镜像过程中因为脚本错误导致很多镜像构建终止&#xff0c;产生很多none标签的版本 手动构建镜像的时候没有进行提交&#xff0c;遗留来的垃圾镜像 这些镜像占据较大的存储空间&#xff0c;需要…

局部变量、全局变量、堆、堆栈、静态和全局

局部变量、全局变量、堆、堆栈、静态和全局--------------------------------------------------------------- 一般全局变量存放在数据区&#xff0c;局部变量存放在栈区&#xff0c; 动态变量存放在堆区&#xff0c;函数代码放在代码区。 ----------------------------------…

博客园的编辑器毛病真多.....

1.有时候首行插入代码后&#xff0c;想删除代码做不到了——代码可以删除&#xff0c;可是那个框死活删不掉。 2.有时候删除大段内容的时候会突然卡住&#xff0c;然后整个页面回退到初始状态——编辑的内容没了&#xff0c;自动保存中也没有。 3.有时候进入编辑页面能看到编辑…

MSN消息提示类(II)

纯js编写跨框架无图片支持调速度任意位置弹出需要ie5.5以上 <HTML><HEAD><SCRIPT languageJavaScript><!--/**//* ** ** 类名&#xff1a;CLASS_MSN_MESSAGE ** 功能&#xff1a;提供类似MSN消息框 ** 示例&#xff1a; ----------…

查看docker-compose --version报错syntax error near unexpected token `(‘‘usr/local/bin/docker-compose:

问题 执行docker-compose --version查看版本是报错如下 /usr/local/bin/docker-compose: line 2: html: No such file or directory /usr/local/bin/docker-compose: line 3: head: No such file or directory /usr/local/bin/docker-compose: line 4: meta: No such file …

Android隐藏软键盘收回软键盘

代码改变世界 Android隐藏软键盘收回软键盘 InputMethodManager imm (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // 隐藏软键盘 imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); 代码中点击按钮实现隐藏软键盘…

oracle低权限下获取shell

转载请标明:http://hi.baidu.com/hack_forensic 《关于oracle列目录的可行性测试》 经过本人测试,确实可行,解决了 kj021320文章的遗憾,kj021320在文章<<ORACLE 建立数据文件WriteWebShell>>最后说,当然这个方法缺点就是你要知道WEB路径.少费话,直接贴code: crea…

spring的父子容器

在创建ssm项目工程时&#xff0c;经常需要读取properties资源配置文件&#xff0c;传统的方法当然可以。 但是spring提供了更简便的方法&#xff0c;value注解。 在page.properties文件中&#xff0c;配置分页信息。 这个时候&#xff0c;发现在Service层用value("${PAGES…