李智慧 - 架构师训练营 第二周

 

总结

编程语言实质:

编程的目的:用计算机来解决现实世界的问题。

编程的过程:在计算机所能理解的模型“模型”(解空间)和现实世界(问题空间)之间建立一种联系。



编程的核心要素:





什么是面向对象编程?

面向对象 (Object Oriented,OO) 的思想对软件开发相当重要,它的概念和应用甚至已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD 技术、人工智能等领域。面向对象是一种 对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

面向过程 (Procedure Oriented) 是一种 以过程为中心 的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是 封装、继承、类。

无论是在软件开发还是在实际工作中,深入地理解软件开发的思想都非常有必要。



面向对象的三要素(特征):

  1. 封装,封装就是事物抽象为类,把对外接口暴露,将实现和内部数据隐藏。

  2. 继承,继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承概念的实现方式有三类:实现继承、接口继承和可视继承。

  3. 多态,多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。实现多态,有二种方式,覆盖,重载。



面向对象设计的目的

强内聚,低耦合,从而使系统易扩展、更强壮、可移植、更简单。

 

设计模式

三大类23种基本设计模式

  1. 创建型模式,共五种:工厂方法模式(一个工厂类ReturnNew子类)、抽象工厂模式(一个厂一个子类)、单例模式(恶汉,懒汉)、建造者模式(组合)、原型模式(Cloneable浅接口,Serializable深接口)。

  2. 结构型模式,共七种:适配器模式(新接口用老实现类)、装饰器模式(同代理,增强)、代理模式(方法前后)、外观模式(计算机包括…)、桥接模式(中间表)、组合模式(树)、享元模式(共享池)。

  3. 行为型模式,共十一种:策略模式(Calculator子类)、模板方法模式(大象装冰箱)、观察者模式(观察者列表)、迭代子模式、责任链模式、命令模式(一层接一层)、备忘录模式(备忘录类包含被备忘录对象)、状态模式(IF)、访问者模式(访问外观模式)、中介者模式(join)、解释器模式(解释公式)。



框架VS工具

工具好比是搓衣板,框架好比是洗衣机,搓衣板只能搓衣服;洗衣机除了洗衣服还能脱水 甩干 加香 定时 定次...,工具其实只干了框架一部分的活,框架整体解决你的问题。



面向对象设计的基本原则

  • Single Responsibility Principle:单一职责原则

一个类应该只有一个发生变化的原因

  • Open Closed Principle:开闭原则

一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭

  • Liskov Substitution Principle:里氏替换原则

所有引用基类的地方必须能透明地使用其子类的对象

  • Law of Demeter:迪米特法则

只与你的直接朋友交谈,不跟“陌生人”说话

  • Interface Segregation Principle:接口隔离原则

客户端不应该依赖它不需要的接口;类间的依赖关系应该建立在最小的接口上

  • Dependence Inversion Principle:依赖倒置原则

上层模块不应该依赖底层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象



总结:从计算机编程的发展历程,引发人类创新、创造性思考;而程序设计也逐步向规范化、工程化发展;设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。

作业一:

  • 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?



依赖倒置原则(Dependence Inversion Principle, DIP),包含如下的三层含义:

  1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象

  2. 抽象不应该依赖细节

  3. 细节应该依赖抽象

问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来实现。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是底层模块,负责基本的原子操作;假如修改A,会给程序带来不必要的风险。

解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。

DIP的本质:通过抽象(抽象类或接口)使各个类或模块实现彼此独立,不互相影响,实现模块间的松耦合。

DIP的好处: 采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

精简定义:面向抽象(抽象类或者接口)编程。



在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。

在软件设计中,高层模块依赖底层模块就像演艺公司依赖演员,底层模块对高层模块来讲不应该是强制被依赖的,也就是说当高层模块需要时进行对底层模块的调用。

作业二:

  • 请描述一个你熟悉的框架,是如何实现依赖倒置原则的?



熟悉Spring框架的人都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念。

IoC是spring的核心,贯穿始终,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。

作业三:

  • 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。

优化后的类图如下图,CacheServiceImpl 类实现两个接口,IApplicationCacheService接口包含 get put delete 暴露给应用程序,IRemoteCacheService接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值