一、OO设计基础
1、封装
2、继承
3、多态
4、抽象
二、OO设计原则
1、找出应用中需要变化之处,让它们独立出来,不要和那些不需要变化的代码混在一处。
2、针对接口编程,而不是针对实现编程。
针对接口编程,即“针对超类型编程”。针对接口编程,关键就在于多态。利用多态,程序可以针对超类型编程,不会被绑死在超类型的行为上。
示例:有一个抽象类Animal,有两个具体的实现(Dog与Cat)继承Animal。
针对实现编程:
Dog d = new Dog();d.bark();
针对接口/超类型编程:
Animal a = new Dog();a.makeSound();
更进一步,子类实例化的动作不再需要在代码中硬编码,而是在运行时才指定具体的对象:
a = getAnimal();a.makeSound();
3、多用组合,少用继承。
4、为了交互对象之间的松耦合设计而努力。
5、开放-关闭原则:类应该对扩展开放,对修改关闭。
应用该原则时,应该把注意力集中在设计中最有可能改变的地方,然后应用开放-关闭原则。
6、依赖倒置原则
要依赖抽象,不要依赖具体类。
这个原则看上去很像“针对接口编程,而不是针对实现编程”,然而这里更强调抽象。这个原则说明了:不能让高层组件依赖低层组件,而且不管是高层还是低层组件,两者都应该依赖于抽象。所谓“高层”组件,是由其他低层组件定义其行为的类。例如,PizzaStore是个高层组件,因为它的行为是由比萨定义的:Pizza创建所有不同的比萨对象,准备、烘烤、切片、装盒;而比萨本身属于低层组件。
下面的指导方针,能帮助我们避免在OO设计中违反依赖倒置原则:
1⃣️ 变量不可以持有具体类的引用。如果使用new,就会持有具体类的引用。你可以改用工厂来避开这样的做法。
2⃣️ 不要让类派生自具体类。如果派生自具体类,就会依赖具体类。请派生自一个抽象(接口或抽象类)。
3⃣️ 不要覆盖基类中已实现的方法。如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被继承的抽象。基类中已实现的方法,应该由所有的子类共享。
我们应该尽量达到这个原则,而不是随时都要遵循这个原则。我们都很清楚,任何Java成勋都有违反这些指导方针的地方。
7、"最少知识" 原则
定义:最少知识原则:只和你的密友谈话。
原则初衷:希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。
该原则提供了一些方针:
就任何对象而言,在该对象的方法内,我们只应该调用属于以下范围的方法:1⃣️ 该对象本身 2⃣️ 被当作方法的参数而传递进来的对象 3⃣️ 此方法所创建或实例化的任何对象 4⃣️ 对象的任 何组件
//未采用该原则 public float getTemp() { Thermometer thermometer = station.getThermometer(); return thermometer.getTemperature(); }
//采用该原则 public float getTemp() { return station.getTemperature(); }