一、OO基本概念:抽象、封装、继承、多态
- 封装的目的是隐藏事务内部的实现细节,以便提高安全性和简化编程。封装提供了合理的边界, 避免外部调用者接触到内部的细节。我们在日常开发中,因为无意间暴露了细节导致的难缠 bug 太多了,比如在多线程环境暴露内部状态,导致的并发修改问题。从另外一个角度看,封 装这种隐藏,也提供了简化的界面,避免太多无意义的细节浪费调用者的精力。
- 继承是代码复用的基础机制,类似于我们对于马、白马、黑马的归纳总结。但要注意,继承可以 看作是非常紧耦合的一种关系,父类代码修改,子类行为也会变动。在实践中,过度滥用继承, 可能会起到反效果。
- 多态. 你可能立即会想到重写(override)和重载(overload)、向上转型。
简单说,重写是 父子类中相同名字和参数的方法,不同的实现;
重载则是相同名字的方法,但是不同的参数,本 质上这些方法签名是不一样
public int doSomething() {
return 0;
}
// 输入参数不同,意味着方法签名不同,重载的体现
public int doSomething(List<String> strs) {
return 0;
}
// return 类型不一样,编译不能通过
public short doSomething() {
return 0;
}
二、 良好的OO设计必须具备 可复用、可扩充、可维护 三个特性
三、OO原则:
- 找出应用中可能需要变化之处, 把它们独立出来,不要和那些不 需要变化的代码混在一起
- 针对接口编程,而不是针对实现 编程。
- 多用组合,少用继承。
- 为交互对象之间的松耦合设 计而努力
- 类应该对扩展开放,对修改关闭。
四、 S.O.L.I.D 原则:
- 单一职责(Single Responsibility),类或者对象好是只有单一职责,在程序设计中如果发现某个类承担着多种义务,可以考虑进行拆分。
- 开关原则(Open-Close, Open for extension, close for modification),设计要对扩展开放,对修改关闭。换句话说,程序设计应保证平滑的扩展性,尽量避免因为新增同类功能而修改已有实现,这样可以少产出些回归(regression)问题。
- 里氏替换(Liskov Substitution),这是面向对象的基本要素之一,进行继承关系抽象时,凡是可以用父类或者基类的地方,都可以用子类替换。
- 接口分离(Interface Segregation),我们在进行类和接口设计时,如果在一个接口里定义了太多方法,其子类很可能面临两难,就是只有部分方法对它是有意义的,这就破坏了程序 的内聚性。
对于这种情况,可以通过拆分成功能单一的多个接口,将行为进行解耦。在未来维护中,如 果某个接口设计有变,不会对使用其他接口的子类构成影响。 - 依赖反转(Dependency Inversion),实体应该依赖于抽象而不是实现。也就是说高层次模块,不应该依赖于低层次模块,而是应该基于抽象。实践这一原则是保证产品代码之间适当 耦合度的法宝
五、设计模式分类
大致按照模式的应用目标分类,设计模式可以分为创建型模式、结构型模式和行为型模式。
-
创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式 (Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)、原型模式(ProtoType)。
-
结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。常见的结构型模式,包括桥接模式(Bridge)、适配器模式(Adapter)、装饰者模式(Decorator)、代理模式(Proxy)、组合模式(Composite)、外观模式(Facade)、 享元模式(Flyweight)等。
-
行为型模式,是从类或对象之间交互、职责划分等角度总结的模式。比较常见的行为型模式 有策略模式(Strategy)、解释器模式(Interpreter)、命令模式(Command)、观察者模式(Observer)、迭代器模式(Iterator)、模板方法模式(Template Method)、访问者模式(Visitor)。