week2
作业一:
1. 请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
设计模式本质是为了达到高内聚低耦合的目的,依赖倒置是六大基本原则的一种,其核心思想是面向接口编程。
A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
高层不直接依赖低层的实现,而是调用高层自己定义的抽象接口,低层进行具体实现,在框架设计中,就可以达到跟业务的解耦,在模块化中也可以最大限度的减负代码。
好莱坞原则:
Do'nt call me, I'll call you. 与高层、低层的模型一致。
2. 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
作业二:
设计模式六大基础原则
总原则:开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。
1、单一职责原则(SRP--Single-Responsibility Principle)
不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分,其实方法也适用于此。
2、里氏替换原则(Liskov Substitution Principle)
里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当衍生类可以替换掉基类,实现的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为,里氏代换原则是对实现抽象化的具体步骤的规范。
在里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:每个接口中做到不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。
5、迪米特法则(Demeter Principle)
就是说:一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过 public 方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
6、合成复用原则(Composite Reuse Principle)
原则是尽量首先使用合成/聚合的方式,而不是使用继承,OOP 为我们带来便利的同时经过 n 次的迭代后,整个项目代码会感觉十分沉重,这也是面向对象被诟病的一点,除非必要,否则聚合优先于继承是开发的一大要点。
UML 关系模型
UML 定义的关系主要有:实现、泛化、依赖、关联、聚合、组合,这六种关系两两成对,紧密程度依次加强,下面分别看一下。
实现概念:
实现是一种类与接口的关系,表示类是接口所有特征和行为的实现,在程序中一般通过类实现接口来描述表示方法:空心三角形箭头的虚线,实现类指向接口
泛化概念:
泛化是一种一般与特殊、一般与具体之间关系的描述,具体描述建立在一般描述的基础之上,并对其进行了扩展。在程序中是通过继承类实现的。表示方法:空心三角形箭头的实线,子类指向父类
依赖概念:
是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖,在程序中一般表现为类 A 中的方法需要类 B 的实例作为其参数或者变量,而类 A 本身并不需要引用类 B 的实例作为其成员变量。表示方法:虚线箭头,类 A 指向类 B。
关联概念:
表示类与类之间的联接,它使一个类知道另一个类的属性和方法,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,在程序中被关联类 B 以类属性的形式出现在关联类 A 中,也可能是关联类 A 引用了一个类型为被关联类 B 的全局变量表示方法:实线箭头,类 A 指向类 B
聚合概念:
聚合关联关系的一种特例,是强的关联关系。聚合是整体和个体之间的关系,即 has-a 的关系,整体与个体可以具有各自的生命周期,个体可以属于多个整体对象,也可以为多个整体对象共享。程序中聚合和关联关系是一致的,只能从语义级别来区分;表示方法:尾部为空心菱形的实线箭头(也可以没箭头),类 A 指向类 B
组合概念:
组合也是关联关系的一种特例。组合是一种整体与部分的关系,即 contains-a 的关系,比聚合更强。部分与整体的生命周期一致,整体的生命周期结束也就意味着部分的生命周期结束,组合关系不能共享。程序中组合和关联关系是一致的,只能从语义级别来区分。表示方法:尾部为实心菱形的实现箭头(也可以没箭头),类 A 指向类 B
其实关于 UML 关系模型其实可以总结三角形、箭头、菱形三种图例进行记忆,根据填充度程度确定关系,填充度越多,关系也越紧密。好了本篇篇幅就写到这边,设计模式其实都是基于 OOP 的思想总结而来的,而市面上的各种基于面向对象的开源框架或产品,都大力应用到了设计模式,因此想攻下一座座堡垒,掌握文中提到的六大基本原则及常见的六种关系模型必不可少。
评论