第二周 - 总结
一、 面向对象编程的三要素(特征,但不是面向对象所独有的)
1、封装性:隐藏实现细节(访问控制)、定义接口。
2、继承性:IS-A关系、HAS-A关系(组合)。
3、多态性:后期绑定(虚函数)、向上转型。
三、 面向对象设计的目的和原则
1、面向对象设计的目的:
强内聚、低耦合,从而使系统
扩展性-易于增加新功能
更强壮-不容易被粗心的程序员破坏
可移值-能够在多样的环境下运行
更简单-容易理解,容易维护
2、面向对象设计的原则:
设计原则、设计模式。
四、 开闭原则(OCP):
1、对于扩展是开放的(可以编写新的类来扩展功能)。
2、对于更改时关闭的(一个已完成的类的更改是关闭的)。
3、关键是要抽象(基于接口编程,接口中不应该依赖具体的实现类,而是依赖其他的接口)。
4、具体结合模式:
1.策略模式:
调用接口不依赖实现类,而是依赖策略接口,具体的实现类实现了这个策略接口。
2. 适配器模式:
3. 观察者模式:
不同的事件触发时,应该调用该事件相对应的事件处理器,让这些处理器做一些处理。
五、 依赖倒置原则(DIP):
1、高层模块不能依赖低层模块,而是大家都依赖于抽象。(接口由高层定义,低层实现该接口,接口属于高层)
2、抽象不能依赖实现,而是实现依赖于抽象。
高层需要什么,低层就给什么。而不是给什么就调用什么。不关心具体的实现。重要的是抽象属于谁,应该是属于高层。框架设计常用。
六、 里氏替换原则(LSP):
1、目的:用来解决继承的问题。一个正确的子类继承父类应符合里氏替换原则。
2、传统:传统的判断继承:Is-a,子类is a父类。如苹果 是 一种 水果。
3、定义:在程序运行中,在使用了父类的地方可以直接使用子类来替换,那么这个子类和父类的继承关系就是合理的。
4、自己理解:在具体使用父类的场景中,能使用子类来替换父类,这个场景还是合理的,那么这个继承就是合理的。主要是看在调用父类的地方的代码的使用。
5、jdk中不符合里氏替换原则例子:
Properties继承了HashTable,Properties只能传入String的
Stack继承了Vector
6、不满足里氏替换原则怎么办:
使用组合(目的就是要使用父类中的方法),在软件编程当中,应该优先使用组合而不是继承。
7、违反里氏替换原则的征兆:
1. 子类中的函数退化,父类函数做了实现,但子类却没有做任何实现。
2. 子类抛出了父类中不会产生的异常。
七、 单一职责接口隔离(SRP):
1、定义:
又被称为:内聚性原则。一个类应该只有一个引起他变化的原因(职责)。
2、职责的划分:
3、实在是有很多职责耦合在一起分不开的:
配合使用接口分离原则
4、就是只有一个原因发生了变化(如一个需求更改了),这个类才会修改代码。
八、 接口分离原则(ISP):
1、定义:
不应该强迫客户程序依赖它们不需要的方法。
2、单一职责原则和接口分离原则都是关于类的内聚性的,单一职责原则指出应该如何设计一个类(只有一个原因才能促使类发生变化),接口分离原则指出应该如何设计一个接口(不要让客户看到他们不需要的方法)。
九、 其它:
1、对象或接口的抽象:
分析用例描述,里面的名称都是可能的对象。
2、设计的好坏判断:
要将设计放到实际环境中考虑,如需求一直在变更,能不能支持较好。
评论