面向对象并没有想象中那么神秘,以生活的现实眼光来看更是如此.把面向对象深度浓缩起来,可以概括为:
⑴目标:重用,扩展,兼容
⑵核心:低耦合,高内聚
⑶手段:封装变化
⑷思想:面向接口编程,面向抽象编程,面向服务编程
举例:在三层架构中,数据层与业务层是用接口作为隔离的抽象,而业务层和表现层同样是用接口作为隔离的抽象,这就保证了重用,扩展以及兼容性
软件任何的设计问题,都可以通过引入中间逻辑得到解决

依赖倒置: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的更多相关文章

  1. 《你必须知道的.NET》读书笔记三:体验OO之美

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...

  2. OO之美4(好代码与坏代码)

    前言:写代码不仅仅要做到能与机器交流,更要做到能和人交流 编码规范:编码规范就是最佳实践,是前辈在编码这件事上的积累和总结,是智慧的延续和工业的实践,如下: ⑴命名规范 ⑵避免行数过多的方法 ⑶代码缩 ...

  3. OO之美3

    面向对象和基于对象 基于对象:所以基于对象,就是一种对数据类型的抽象,封装一个结构包含了数据和函数,然后以对象为目标进行操作.构建的基础是对象,但是操作对象并不体现出面向对象的继承性,也就是基于对象局 ...

  4. OO之美

    ㈠ 设计的分寸 对于设计,还有很多看似"惯常"的法则与经验广泛存在于软件系统中,例如除了经典的23种设计设计模式.还有很多模式之外的模式,按照粒度的大小,系统的特点,规模的大小,而 ...

  5. 《必须知道.NET》3.OO之美

    3.2 依赖的哲学 3.2.1 本质诠释 "不要调用我们,我们会调用你" 3.2.2 什么是依赖,什么是抽象 "耦合是不可避免的" (1)什么是依赖和耦合 依赖 ...

  6. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  7. 设计模式之美:Type Object(类型对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...

  8. 结对编程-地铁续(有种上个学期OO的既视感)

    我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...

  9. 菜鸡谈OO 第二单元总结

    “欢迎来到(玄学)多线程的新世界” Homework1 单部傻瓜电梯调度 Part1 多线程设计策略 第一次学到了线程这个概念,与之前的编程体验大有不同.最大的区别在于从原本的线性发生程序变成了多个行 ...

随机推荐

  1. 触碰jQuery:AJAX异步详解

    触碰jQuery:AJAX异步详解 传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML( ...

  2. wp ApplicationBar

    WP7中的菜单栏 一个应用程序的菜单栏的内容是有限的,最多不超过4个,排列顺序是以菜单栏中间为中心,然后从左往右排列. WP7提供了两种类型的菜单栏,一种是全局的菜单栏,也就是说在所有的页面中都会出现 ...

  3. HDU 4612 Warm up(Tarjan)

    果断对Tarjan不熟啊,Tarjan后缩点,求树上的最长路,注意重边的处理,借鉴宝哥的做法,开标记数组,标记自己的反向边. #pragma comment(linker, "/STACK: ...

  4. Js操作Select大全

    判断select选项中 是否存在Value="paraValue"的Item 向select选项中 加入一个Item 从select选项中 删除一个Item 删除select中选中 ...

  5. Html - 圆圈border

    很多场景下需要对元素加入圆圈.但光靠border-radius其实还要调很久,所以做一下笔记 #binggan .mui-icon { display: inline-block; margin: 3 ...

  6. IIS5与IIS6 应用程序生命周期和页生命周期

    在写这篇博客之前,知好多前辈已经写过,自己班门弄斧,主要是加深自己对细节的理解,另一方面希望对浏览此篇文章的读者一个新的认识.注定是一长篇.肯定有新的认识,图示都是原创. 此篇所有牵涉的细节,我会一一 ...

  7. Android基础知识

    一.四大组件 Activity(活动).Service(服务).BroadcastReceiver(广播器).Content Provider(内容提供器) 二.五大布局 LinearLayout(线 ...

  8. 《Ant权威指南》笔记(一)

    Ant的由来(序) James Duncan Davidson当年用纯Java开发Tomcat的时候,不仅想让它跨平台运行,还想要在不同的操作系统上都能够进行开发和构建.这种较大的项目的编译构建过程是 ...

  9. cURL 学习笔记与总结(2)网页爬虫、天气预报

    例1.一个简单的 curl 获取百度 html 的爬虫程序(crawler): spider.php <?php /* 获取百度html的简单网页爬虫 */ $curl = curl_init( ...

  10. swfit-block反向传值

    // ViewController.swift // Block import UIKit class ViewController: UIViewController { var myLabel = ...