十年一剑 -- 面向对象思想
一、三大特性
- 封装:利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
- 继承:继承应该遵循里氏替换原则,自雷对象必须能够替换掉所有父类对象。
- 多态
- 编译时多态:主要指方法的重载
- 运行时多态:程序中定义的对象引用所指向的具体类型在运行期间才确定
二、类图(这里只简单介绍)
- 泛化关系:Java中的继承
- 实现:Java中对接口的实现
- 聚合:表示整体由部分组成,但不是强依赖,整体不存在了部分还是会存在,比如电脑由显示器、主机、键盘鼠标等聚合在一起
- 组合:强依赖,整体不存在了,部分也就不存在了,比如公司和部门
- 关联关系:一对一、一对多、多对多
- 依赖:依赖是在运行过程中起作用,比如a类是b类的一个局部变量
三、设计原则
- 单一责任原则
修改一个类的原因应该只有一个
就是一个类只负责做一件事情,如果一个类承担了过多的职责会增加耦合
- 开放封闭原则
对扩展开放,对修改关闭
扩展就是添加新功能的意思,该原则要求在添加新功能或者需求发生变化时,通过添加新的代码来扩展模块的行为,而不是去修改那些已经存在的可以工作的代码。对这一原则的实现是使用抽象,把功能定义为一个抽象基类,它可以衍生出不同的子类来实现不同的功能,当需要扩展时只要添加新的实现就可以。
- 里氏替换原则:子类对象必须能替换所有父类对象(貌似java的继承语法默认实现了这一原则)
- 接口分离原则:不应该强迫客户端依赖于它们不使用的方法,大概也是一对一的想法,一个接口就是一个功能,不要把与这个功能无关的内容写到里面
- 依赖倒置原则
高层模块不应该依赖于低层模块,二者都应该依赖于抽象;
抽象不应该依赖于细节,细节应该依赖于抽象。
本质的意思是说一个类a不要直接依赖另一个确切的类b,这种情况下如果后续的b的功能要发生变化的时候a会直接的受到影响,如果a需要依赖b那把b抽象出来成为接口,a去依赖于接口,后续b的需求发生了变化那就扩展接口,a的源码不需要发生变化
自我解读
这一个笔记的内容比较抽象,都是一些设计结构的思想,有一些东西需要明确。下面举一个栗子
母亲每天都要为小孩讲睡前故事
- 复杂的说(觉得很有意思):这个事情是这样的本质是为了孩子入睡,所以这里有两个对象一个是母亲一个是孩子他们都是人的子类,孩子有一个变量叫懵逼值和一个状态值叫做入睡或者清醒,母亲有一个方法叫讲故事,讲故事这个方法需要一个参数–故事的内容来源,当母亲调用讲故事这个方法时孩子的懵逼值会上升,当懵逼值上升到一个点的时候状态由清醒变为入睡。
- 简单的说:母亲有一个方法叫讲故事,我们要调用这个方法
1 |
|
很明显一般妈妈脑瓜子里也不会记那么多的故事,也是要照着书念的,所以妈妈讲故事这个方法得依赖于一个对象故事书,在上面的模型里面如果妈妈哪天故事书上的故事讲完了,要讲这个报纸上的故事,但是很尴尬妈妈居然只会读书不会读报纸,这很明显和现实是不吻合的,所以得改一下
interface IReader{
public String getContent();
}
这是一个抽象的接口–读物,妈妈是可以读任何读物的
class Newspaper implements IReader {
public String getContent(){
return "林书豪17+9助尼克斯击败老鹰……";
}
}
class Book implements IReader{
public String getContent(){
return "很久很久以前有一个阿拉伯的故事……";
}
}
class Mother{
public void narrate(IReader reader){
System.out.println("妈妈开始讲故事");
System.out.println(reader.getContent());
}
}
public class Client{
public static void main(String[] args){
Mother mother = new Mother();
mother.narrate(new Book());
mother.narrate(new Newspaper());
}
}
现实的模型就应该是这样,哪天妈妈想给孩子读别的东西就去买回来,然后读就行了,这里有一个概念IReader、Newspaper、Book、Mother这些都是已经存在的,不应该被修改,只是添加新的模块(买一份海报),而修改Client这个类是应该的,它怎么说呢和上面别的类是不一样的,属于是对逻辑的处理,而不是一个对象实体
