面向对象-设计原则
设计模式
类的功能只有一个,只解决一个问题
一个类功能越多,他与其他类关联越多。这样就是紧耦合
紧耦合就是模块或者系统之间关系太紧密,存在相互调用。
这样可以降低系统的耦合度
用拓展的方式和新的类去解决新的问题
因为用修改的方式会容易引入错误
子类的功能强于父类。
但有时子类无法替换父类,例如子类对父类的方法进行覆盖和重载,那么他们的功能将不一致。这样会出现安全隐患。
李氏原则提倡少用覆盖和重载,因为其他人可能不知道你覆盖和重载了父类的某些方法,这样在调用子类被覆盖和重载的方法时就会出错。
如果想让子类随时能替代父类,那么就少"重载"。
但是如果父类是一个接口,那么上面的问题就不再存在了。
所以编程要针对接口编程,而不进行具体的类进行编程。
所以面向对象的核心是抽象
计算机用的是接口:更换显卡,只需要拔掉再插上一个新的显卡就行
电视机用的是焊接:必须要进行焊接才能装上
避免职责过多而造成疏漏
继承要少用
用继承的话,父类变了,所有的子类也要跟着改变。
所以要多用组合。
继承(inheritance),是类 D 的对象可以使用仅对类C的对象有效的方法或者属性的特性,它使得这些方法和属性就好像是由类 D 定义的。这时,C 是 D 的父类,D 是 C 的子类。在继承结构中,父类的内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种"白盒式代码复用"。
组合(composition),是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是"黑盒式代码复用"。
知道越多就越容易绕开规则,对另一个对象的属性和方法进行调用
解决的方法是使用封装。
需求开发-需求分析-OOA-UML
(UML)又称统一建模语言或标准建模语言
构造块
结构图
行为图
静态图
动态图
用例图:动态图(大多数情况)
表达的是系统和外部的交互关系
顺序图:强调按"时间"顺序
通信图:不强调时间顺序
状态图:状态的变迁转移的情况
活动图:与流程图的结构相同
部署图:软件的构建应该部署在哪个硬件节点上
面向对象-设计模式的概念
从高中低三个复用级别进行分来
架构模式:
高层决策:从全局来看待问题得到的结论
设计模式:
局部问题的设计问题,比如楼梯的样子,窗帘的形状
在构件的设计中会用到
惯用法:
最低,可以从与语言相关看出来
面向对象-设计模式的分类
创建型模式:创建对象
把创建对象的工作交给工厂
结构型模式:处理类和对象的组合问题
让类和对象形成更大的规模,实现更高的指导
行为型模式:
描述类和对象交互的情况,以及职责的分配问题
面向对象-创建型模式
抽象工厂
做系列产品,比如创建数据库相关的一系列组件,指定生产的数据库是access,那么所有生产的部件都是access数据库的,如果指定的部件是oracle的那么生产的所有部件都是oracle的
只需要指定系列名,而不需要指定具体的类,就能生产产品
构建器模式
要构造某一个复杂的对象,这个对象可能是由多个不同的对象组合起来的。
把各个部分封装起来,对各个部分指定不同的部件,最后实现实例
工厂方法模式
在运行的时候去指定要创建的是哪一个类的对象
推迟子类的实例化
原型模式
相比用new创建新的对象,原型模式的效率会更加高一些。
单例模式
一个类只有一个实例
比如:浏览器里面可以打开多个页面,但是浏览器的主窗口只有一个
面向对象-结构型模式
边界类
面向对象-行为型模式
财务审批: 500块以下 (1)处理,2000以内(2)处理(签批)
避免请求者与多个接收者进行联系
解释器模式相当构造了一个虚拟机去处理问题
比如指针的.next,访问下一个元素,而不是用a[8]这样的方式去访问一个对象中的各个元素
上面是两个对象进行消息的直接传递,A有变化,B要跟着改变
如果他们之间有一个中间对象,那么当A改变,改变这个中间对象就可以了。
这在多对象交互的时候很有作用。
开辟一片空间把对象的目前的状态信息存下来,以便以后可以恢复到这个状态
Excel的a1=1 a2=2 a3 = a1+a2
比如会员的级别
对一组数进行排序,选择算法