设计模式中的6大准则
一、里氏替换原则
我们知道Java的三大特性:封装,继承,多态。Java 继承有很多优点,是减少重复代码的可靠手段。
但是继承同时存在一些缺点:
- 类的耦合性增加了。比如父类更改之后子类也同时需要更改
- 降低代码灵活性。因为继承时,父类会对子类有约束性
我们使用里氏替换原则
,可以减少继承带来的问题。
定义:
里氏替换原则(LSP)指的是所有引用基类的地方都可以透明的使用其子类的对象,可以理解为:只要有父类出现的地方,都可以使用子类来替代。而且不会出现任何错误或者异常。但是反过来却不行。子类出现的地方,不能使用父类来替代。
具体约束:
1.子类必须实现父类的抽象方法,但不得重写父类的非抽象(已实现的)方法。
2.子类中可增加自己特有的方法。(可以随时扩展)
3.当子类覆盖或者实现父类的方法时,方法的前置条件(方法形参)要比父类输入参数更加宽松(父类HashMap,子类Map)。否则会调用到父类的方法。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格(父类Map,子类HashMap)。否则会调用到父类的方法。
二、依赖倒置原则:要面向接口编程,不要面向实现编程。
依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,满足下列四点:
- 每个类尽量提供接口或抽象类,或者两者都具备。
- 变量的声明类型尽量是接口或者是抽象类。
- 任何类都不应该从具体类派生。
- 使用继承时尽量遵循里氏替换原则。
1 //商店 2 interface Shop{ 3 public String sell(); //卖 4 } 5 //韶关网店 6 class ShaoguanShop implements Shop{ 7 public String sell(){ 8 return "韶关土特产:香菇、木耳……"; 9 } 10 } 11 //婺源网店 12 class WuyuanShop implements Shop{ 13 public String sell(){ 14 return "婺源土特产:绿茶、酒糟鱼……"; 15 } 16 } 17 //顾客 18 class Customer{ 19 public void shopping(Shop shop){ 20 //购物 21 System.out.println(shop.sell()); 22 } 23 } 24 public class DIPtest{ 25 public static void main(String[] args){ 26 Customer wang=new Customer(); 27 System.out.println("顾客购买以下商品:"); 28 wang.shopping(new ShaoguanShop()); 29 wang.shopping(new WuyuanShop()); 30 } 31 }