主要针对类的设计
接口要做到单一原则,类的设计尽量做到只有一个原因引起变化
任何基类可以出现的地方,子类一定可以出现
如果子类不能完整的实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”。则建议断开父子继承关系,采用依赖,聚合,组合等关系代替。(如下图ToyGun)
如果某个子类有新特性时,如何保证不违背“里氏替换原则”呢?
【子类方法的参数】一定要是【父类方法的参数】的父类
public class test { public static void main(String[] args) { Soldier f = new Soldier(); SuperSoldier s = new SuperSoldier(); HashMap map = new HashMap(); f.shoot(map); // 给士兵一把机枪,士兵可以射击。(合理) s.shoot(map); // 给特种兵一把机枪,特种兵可以射击。(合理) // 反例 f.shoot1(map); // 父类和子类调用的结果不一样,违反里氏原则。(不合理) s.shoot1(map); // 父类和子类调用的结果不一样,违反里氏原则。(不合理) } } class Soldier{ public void shoot(HashMap<String,String> map){ // 每个士兵拿着“机枪”可以射击 System.out.println("soldier shoot ...."); } public void shoot1(Map<String,String> map){ System.out.println("soldier shoot ...."); } } class SuperSoldier extends Soldier{ public void shoot(Map<String,String> map){ // 特种兵只要有“枪”就可以射击 System.out.println("SuperSoldier shoot ...."); } public void shoot1(HashMap<String,String> map){ System.out.println("SuperSoldier shoot ...."); } }
依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。
在实际编程中,我们一般需要做到如下3点:
主要针对类之间的依赖耦合关系。
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。如果一个类依赖一个臃肿的接口(接口中有该类根本不需要的方法,但是该类必须实现此方法)是不合理的
对扩展开放,对修改关闭
如果要增加新的功能,有如下2种方法