面向对象的三个特征
- 封装(属性、方法,解决数据安全问题)
- 继承(父子之间,解决复用问题)
- 多态(接口实现,解决扩展问题)
面向对象的设计原则
衡量设计好坏
- 僵化性:设计难以改变
- 脆弱性:设计容易被破坏
- 牢固性:角色(用户管理、用户角色管理)重用性差
- 粘滞性:难去做正确的事情(破坏最初的设计)继承-引用
- 不必要复杂性:过度设计,画蛇添足
- 不必要的重复:个税计算(工资计算、财务结算)
- 晦涩性
设计原则
- 里氏代换原则(LSP)
- “开闭”原则(OCP)
- 单一职责原则(SRP)
- 接口隔离原则(ISP)
- 依赖到转原则(DIP)
- 组合/聚合复用原则(CARP)
- 迪米特法则(LOD)
设计模式
设计模式思想
- 松耦合
- 针对接口编程,而不是针对实现编程
- 继承、组合、委托、多态、参数化
- 封装变化,让变化的影响最小
- 封装复杂性,提供简单的接口
设计模式问题
- 对象过多
- 更复杂的装配关系
- 测试难度更大
- 程序结构复杂
常见设计模式
工厂模式
定义
单独定义一个专门用于创建对象的工厂接口,让子类来决定实例化哪一个类。该工厂接口提供一个工厂方法将类的实例化延迟到其子类。
适用场景
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建对象的时候
单例模式
定义
- 对象创建模式
- 确保系统中某类具有一个全局可访问的唯一实例
- 性能优点
- 对频繁使用的对象,省略创建对象的时间,特别是重量级对象
- new的操作次数减少,减轻GC压力,缩短GC时间
适用场景
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时
策略模式
定义
定义一系列的算法,把它们一个一个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用场景
- 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法
- 算法使用客户不应该知道的数据,可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
装饰模式
定义
- 该模式基于合成复用原则,利用委托机制,可以动态添加对象功能
- 运动时,将多个功能组件进行叠加,构造“超级对象”,各个子功能模块,被很好地维护在各个组件相关类中
- 从性能优化角度看,利用该模式可以做到功能模块和性能模块的分离。从而提升模块可维护性,增加复用性
观察者模式
定义
- 当一个对象的行为,依赖另一个对象的状态时,该模式相当有用
- 从性能来看,如果不使用该模式,一般就需要开启线程不断的轮询监听依赖对象的状态,对系统产生额外负担