程序中全部的依赖关系都终止于抽象类或者接口, 才是真正的面向对象设计java
设计原则一 : 单一职责原则编程
定义: 对于一个类,应该只有一个引发它变化的缘由.ide
优势: 下降类的复杂度,提升类的可读性,提升系统的可维护性.函数
例子: spa
//超人类 public class SuperMan { public void 维护世界和平(){ //超人维护世界和平 } } 扩展: public class Animal { public void breathe(String animal){ System.out.println(animal + "在空气中呼吸"); } public void breathe2(String animal){ System.out.println(animal + "在水中呼吸"); } }
能够违反单一职责原则的条件: 须要足够简单的逻辑,才能够在 代码级别上 违反单一职责原则.设计
须要类中的方法数量足够少,才能够在 方法级别上 违反单一职责原则.code
设计原则二 : 里氏代换原则 (Liskov Substitution Principle, LSP)
对象
定义: 子类型必须可以替换掉它们的父类型.
继承
该原则反映了父类和子类的关系,是面向对象设计中最重要也是最基本的原则之一.接口
优势:使的代码复用变得简单
//老木匠类 public class OldCarpenter { public void makeFurniture(){ System.out.println("作出一把椅子!"); } } //老木匠徒弟类 public class YoungFurniture() extends OldCarpenter{ //覆盖父类方法 @Override public void makeFurniture(){ super.makeFurniture(); System.out.println("装饰了一下椅子!"); } }
设计原则三 : 开放-封闭原则(Open Closed Principle, OCP)
定义: 程序的实体对象(模块,类,函数等)应该能够进行扩展,但不该该能够修改
特征: 对于扩展是开放的, 对于修改是封闭的
意义: 开放-封闭原则的核心思想就是面向抽象编程
//动物类 public class Animal { //动物会呼吸 public void breath(){ System.out.println("呼吸"); } } //猫类从动物类继承 public class Cat extends Animal { public void catchMouse(){ System.out.println("猫抓老鼠"); } } //咪咪类 public class Mimi extends Cat{ public void Swimming(){ System.out.println("咪咪在游泳"); } }
设计原则四 : 依赖倒转原则
定义: 程序的高层模块不该该依赖于低层模块,但二者都应依赖于抽象 ; 抽象不该该依赖于具体细节,而细节应该依赖于抽象.
面向对象应该针对接口编程,而不是针对现实编程.
使用该原则的规范: 1. 每一个类尽可能都继承自接口或抽象类 , 或者 抽象类和接口二者都具有.
2. 变量的显示类型尽可能是接口或者是抽象类
3. 尽可能避免从具体类派生
4. 尽可能不要覆盖基类的方法 , 由于类间依赖的是抽象,覆盖了抽象的方法,对依赖的稳定性会产生必定
的影响
//工做者接口 interface IWorker { public void work(); } public class Worker implements IWorker{ @Override public void work() { // TODO Auto-generated method stub } } //新增工做者 public class SeniorWorker implements IWorker{ @Override public void work() { // TODO Auto-generated method stub } } //管理类 public class Manager { IWorker m_worker; public void setWorker (IWorker w){ m_worker = w; } public void manager(){ m_worker.work(); } }
设计原则五 : 合成/聚合复用原则
定义: 尽可能不使用类继承, 而尽可能使用合成/聚合
聚合是一种比较"弱"的拥有关系,具体表现是 ; 甲对象中能够包括乙对象,但乙对象不是甲对象的一部分
合成是一种比较"强"的拥有关系,具体表现是 : 严格的总体与部分之间的关系,且总体与部分有相同的生命周期
怎样选择使用继承仍是 合成/聚合方法?
1. 子类是父类的一个特殊种类,而不是父类的一个角色时,使用继承.即区分是"Is-A"和"Has-A". "Is-A"用继承,"Has-A"用合
成/聚合
2. 永远不会出现须要将子类换成另一个类的子类时,使用继承.
3. 子类具备继承父类的责任,而不是重写父类的方法时,使用继承
设计原则六 : 迪米特法则(最少知识原则)
定义: 若是两个类之间没必要直接通讯,则这两个类不该该发生直接的相互做用. 若是其中一个类须要调用另外一个类的某个方法,能够经过第三方来转发这个调用.