OO之美2
面向对象并没有想象中那么神秘,以生活的现实眼光来看更是如此.把面向对象深度浓缩起来,可以概括为:
⑴目标:重用,扩展,兼容
⑵核心:低耦合,高内聚
⑶手段:封装变化
⑷思想:面向接口编程,面向抽象编程,面向服务编程
举例:在三层架构中,数据层与业务层是用接口作为隔离的抽象,而业务层和表现层同样是用接口作为隔离的抽象,这就保证了重用,扩展以及兼容性
软件任何的设计问题,都可以通过引入中间逻辑得到解决
依赖倒置:1,高层模块不应该依赖于低层模块,二者应该依赖于抽象.2,抽象不应该依赖于具体,细节应该依赖于抽象.你不要来调我,我来调你
当面试官问你为什么要依赖倒置时:你可以从以下几个点来回答
1,依赖倒置时保证开放封闭的前提和基础
2,依赖倒置是对抽象和依赖的基本原则和基本思想的哲学阐释
3,依赖倒置是框架设计的核心思想
4,依赖导致是控制饭庄和依赖注入的思想基础
以前的结构化编程高手一般一出手就是高层依赖于低层的典型套路.带来的麻烦往往是当低层出现了一点点变化,高层也要跟着变化.例如低层多了结果案例,则高层就多了几个if else
而现在依赖于抽象,则不管低层如何变化,高层都是不变的
所以说,当你的代码中没有出现依赖倒置,依然还是结构化编程,而非面向对象编程
就原理而言:
1,少继承,多聚合
2,单向依赖(低耦合,高内聚)
3,封装抽象
4,对依赖关系都应该终止于抽象类和接口
在此,引用BOb大叔三句话,
①任何变量都不应该持有一个指向具体类的指针或者引用
②任何类都不应该从具体类派生
③任何方法都不应该覆写它的任何基类中已经实现的方法.
典型的以new进行的对象创建操作,是对依赖倒置原则的典型违反,而通过依赖注入进行对象的创建解耦是常用的解决之道
一味的遵守原则,就等于没有原则.重要的是,需要把握平衡,在进行开发中适当地把握其程度.Bob在<>中也提到并总结了两个弊端,同样需要特别的关注:
1,######对抽象编程,需要增加必要的类和辅助的代码进行支持,某种程度上增加了系统复杂度和维护成本.#######
2,#######当具体类不存在变化时,遵守依赖倒置是多此一举.所以,如果具体或细节没有变化可能时,没有必要通过抽象转嫁依赖.#######
解构控制反转(IOC)和依赖注入(DI)
控制反转
简而言之,控制反转就是代码的控制器交由系统控制,而不是在代码内部,通过IOC,消除组件或者模块间的直接依赖,使得软件系统的开发更具有柔软性和扩展性.控制反转的典型应用体现在框架系统的设计上,是框架系统的基本特征,不管是.NET Framework抑或是Java Framework都是建立在控制反转的思想基础之上的.
控制反转很多时候被看作是依赖倒置原则的一个同义词,其概念产生的背景大概来源框架系统的设计,例如:.NET Framwork就是一个庞大的Framwork系统.在.net framework大平台上可以很容易的构建ASP.NET Web应用等等其他应用.很多时候,基于 .net framework构建自定义系统的方式就是对.net framework本身的扩展,调用框提供的基础API,扩展自定义的系统功能和行为.然而,不管是如何构建新的或者扩展自定义功能,代码执行的最终控制权还是回到框架中执行,再交回应用程序.所以控制反转强调控制权的反转,体现了控制流程的依赖倒置,所以从这个意义上来说,控制反转是依赖倒置的特例.
依赖注入(请关注Unity)
客户依赖于服务类的抽象接口,并在运行时根据上下文环境,由其他组件(例如DI容器)实例化具体的服务类实例,将其注入到客户类的运行时环境,实现客户类与服务类实例之间松散的耦合关系.
常见的三种注入方式
Ⅰ.接口注入,将对象间的关系转移到一个接口,以接口注入控制.
Ⅱ.构造器注入,客户类在类型构造时,将服务类实例以构造函数参数的形式传递给客户端,因此服务类实例一旦注入将不可修改.
Ⅲ.属性注入,通过客户类属性设置的方式,将服务器实例在运行时设定为客户类属性,相较构造器注入方式,属性注入提供了改写服务器类实例的可能.
经典设计模式
⑴创建型模式;工厂方法,抽象工厂,单例,创建者,原型模式
创建型模式的核心关注点就在于对象的创建的依赖关系上.将对象的依赖从new操作中解脱出来,隔离应用系统和类型实例化间的依赖.例如通过引入工厂,将对象创建职责委托于工厂类,解除了应用系统与类型对象在实例化过程中的直接引用.
⑵结构型模式:桥接,适配器,组合,外观,装饰,享元,代理
结构型模式,是将简单类型组合为复杂类型的过程.通过灵活的设计要素,最终保证不同类型间保持尽量间接的引用和尽量松散的耦合,在复杂类型有更多变化与诉求时.以最小的代价兼容变化,扩展诉求.例如,适配器模式的两种不同适配方式,分别代表了通过继承和组合方式实现对象适配的处理;而代理类模式,则通过引入代理,来隔离不同层次间的依赖,同时保证真实对象的安全性与封装性.
⑶行为型模式:模板方法,迭代器,中介者,职责链,解释器,命令,观察者,备忘录,状体,策略,访问者
行为型模式,关注对象行为的扩展和对象间数据关系的通信,以面向对象方式描述控制流.例如.职责链避免请求的发送者和接收者直接的直接耦合,而是将多个对象连成一条处理链条;而命令模式的核心则在于将行为的请求者和行为实现者之间通过封装的命令对象解耦.
总结:
关于依赖的哲学不规则总结
1,以new创建对象,是对依赖倒置原则典型的违反,可以通过工厂模式或者依赖注入来解决
2,一个对象持有另一个具体对象的引用可能破坏了依赖倒置
3,所有结构良好的面向对象都具有清晰的层次定义,每个层次通过一个定义良好的受控接口向外提供一组内聚服务.
4,依赖倒置预示着程序中的依赖关系不应该是具体的类型,而应该是抽象类和接口
5,依赖倒置适用于当一个类向另一个类发送消息的任何情况.
OO之美2的更多相关文章
- 《你必须知道的.NET》读书笔记三:体验OO之美
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...
- OO之美4(好代码与坏代码)
前言:写代码不仅仅要做到能与机器交流,更要做到能和人交流 编码规范:编码规范就是最佳实践,是前辈在编码这件事上的积累和总结,是智慧的延续和工业的实践,如下: ⑴命名规范 ⑵避免行数过多的方法 ⑶代码缩 ...
- OO之美3
面向对象和基于对象 基于对象:所以基于对象,就是一种对数据类型的抽象,封装一个结构包含了数据和函数,然后以对象为目标进行操作.构建的基础是对象,但是操作对象并不体现出面向对象的继承性,也就是基于对象局 ...
- OO之美
㈠ 设计的分寸 对于设计,还有很多看似"惯常"的法则与经验广泛存在于软件系统中,例如除了经典的23种设计设计模式.还有很多模式之外的模式,按照粒度的大小,系统的特点,规模的大小,而 ...
- 《必须知道.NET》3.OO之美
3.2 依赖的哲学 3.2.1 本质诠释 "不要调用我们,我们会调用你" 3.2.2 什么是依赖,什么是抽象 "耦合是不可避免的" (1)什么是依赖和耦合 依赖 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- 设计模式之美:Type Object(类型对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...
- 结对编程-地铁续(有种上个学期OO的既视感)
我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...
- 菜鸡谈OO 第二单元总结
“欢迎来到(玄学)多线程的新世界” Homework1 单部傻瓜电梯调度 Part1 多线程设计策略 第一次学到了线程这个概念,与之前的编程体验大有不同.最大的区别在于从原本的线性发生程序变成了多个行 ...
随机推荐
- 微信公众平台开发:Web App开发入门
WebApp与Native App有何区别呢?Native App:1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C.2.更新体验较差.同时也比较麻烦.每一次发布新的版 ...
- 【BZOJ】1003: [ZJOI2006]物流运输trans(SPFA+DP)
http://www.lydsy.com/JudgeOnline/problem.php?id=1003 这题一开始看是不会的额,,,还是看题解了..一开始我觉得不能用最短路啥的,,看了题解发现这是d ...
- [BZOJ 3759]Hungergame
Nim游戏获胜的条件是所有石子的异或和为0 如果先手要获胜,那么一定是打开了一个异或和为0的极大子集 什么是极大子集呢? 就是无论后手打开任何子集的箱子,都不能再使此时打开的箱子异或和为0. 容易证明 ...
- 二分查找算法java实现
今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...
- ArcEngine开发:IElement.Geometry 值不在预期范围内 + 元素绘制代码
IElement pEle = pLineEle as IElement; pEle.Geometry = pLn; pLn为一个ILine对象,想当然的以为它是IGeometry对象,可以赋值,结果 ...
- 单词游戏-基于SQLite+Qt的C++项目
SQLite文件数据库的操作 Qt插件的安装配置 1.VS2008下安装Qt开发包 解压缩4.7.3.rar到C:\Qt\4.7.3\ Qt for VS addin2.安装并配置Visual Ass ...
- 连连看的设计与实现——四人小组项目(GUI)
项目GUI界面经过简单设计,整理如下:(图片截取致宠物连连看3.1) 点开游戏后界面显示: 点击菜单游戏—>初级 后显示 -------------------------- > 当游戏时 ...
- CSS3:过渡大全
代码 地址:http://jsbin.com/moquyesumi/edit?html,output <!DOCTYPE HTML> <html> <head> & ...
- snprintf/strncpy/strlcpy速度测试
速度测试代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <un ...
- [服务器]脚本:批处理带参数ping命令 发送邮件脚本
1.批处理带参数ping命令 @echo offecho Input you IP address ......set /p IP=echo Your IP number is %IP%.ping % ...