设计模式7大原则

开闭原则(Open-Closed Principle, OCP)

​ 面向抽象的一个设计原则,指一个实体类的方法对外开放扩展,但是不给修改原模块方法的,假设我有一个接口类,定义了几个方法,继承或实现这个接口的实体类是可以重写接口类的方法。所谓开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。开闭原则,是面向对象设计中最基础的设计原则。

​ 在现实生活中对于开闭原则也有体现。比如,很多互联网公司都实行弹性制作息时间,规定每天工作 8 小时。意思就是说,对于每天工作 8 小时这个规定是关闭的,但是你什么时候来,什么时候走是开放的。早来早走,晚来晚走。

依赖倒置原则(Dependence Inversion Principle,DIP)

​ 设计代码结构时,高层模块不应该依 赖底层模块,二者都应该依赖其抽象。通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并能够降低修改程序所 造成的风险。

看下代码例子:

public interface A { 
    void test01();
}

加一个B、C类实现A类

public class B implements A { 
    @Override 
    public void test01() { 
        System.out.println("B test01");
    }
}

public class C implements A { 
    @Override 
    public void test01() { 
        System.out.println("C test01");
    }
}

创建一个D的实体类来看看调用展示,也可以通过构造的方式入参

public class D { 
    public void test01(A a){
        a.test01();
    }
    
    private A a;
    public D(){
    public D(A a){
        this.a = a;
    }
     public void test01(){
        a.test01();
    }
    public static void main(String[] args) {
        D d = new D();
        d.test01(new B());
        d.test01(new C());
        //构造方法, 需要在D类中加入构造方法
        D d1 = new D(new B());
        d1.test01();
    }
}

这样来看是不是容易理解许多。大家在拿到需求后一定要面向接口编程。先顶层再细节

单一职责(Simple Responsibility Pinciple,SRP)

​ 即一个类或者一个方法的的单一职责性,打个比方我们一个接口类如果定义了4个方法分别是用户信息获取、密码修改、支付、退款,那么我们可以将该接口分为两个接口类,用户相关与支付相关。这样就符合了类的单一职责性

public interface Service { 
    //获得基本信息 
    String getCourseName(); 
    //修改用户密码 
    boolean updatePass(); 
    //支付 
    void pay(); 
    //退款
    void refund(); 
}

/** 拆分后的接口类 **/

//拆分用户相关接口类
public interface UserService { 
    //获得基本信息 
    String getCourseName(); 
    //修改用户密码 
    boolean updatePass(); 
}
//支付相关接口类
public interface PayService(){
     //支付 
    void pay(); 
    //退款
    void refund();
}

接口隔离原则(Interface Segregation Principle, ISP)

​ 指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时应当注意一下几点:

​ 1、一个类对一类的依赖应该建立在最小的接口之上。

​ 2、建立单一接口,不要建立庞大臃肿的接口。

​ 3、尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。

​ 打个比方,如果定义一个总接口,我只需要这个接口某一个抽象方法,但是实际接口中存在很多其它的方法,这个时候我就要实现接口的所有方法。根据面对对象的思想,我们尽可能面向业务抽象。可以定义多个接口,那么我需要某一个抽象的时候,可以多继承

迪米特原则(Law of Demeter LoD)

​ 迪米特原则(Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知 道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。迪米特原则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以称之为成员朋友类, 而出现在方法体内部的类不属于朋友类。

里氏替换原则(Liskov Substitution Principle,LSP)

​ 可以理解为一个软件实体如果适用一个父类的话,那一定是适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变。根据这个理解,我们总结一下:

​ 引申含义:子类可以扩展父类的功能,但不能改变父类原有的功能。

​ 1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

​ 2、子类中可以增加自己特有的方法。

​ 3、当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法的输入参数更宽松。

​ 4、当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类更严格或相等。

​ 使用里氏替换原则有以下优点:

​ 1、约束继承泛滥,开闭原则的一种体现。

​ 2、加强程序的健壮性,同时变更时也可以做到非常好的兼容性,提高程序的维护性、扩展性。降低需求变更时引入的风险

合成复用原则(Composite/Aggregate Reuse Principle,CARP)

​ 指尽量使用对象组合(has-a)/ 聚合(contanis-a),而不是继承关系达到软件复用的目的。可以使系统更加灵活,降低类与类之间的耦

合度,一个类的变化对其他类造成的影响相对较少。

​ 继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类。组合/聚合也称之为黑箱复用,对类 以外的对象是无法获取到实现细节的。要根据具体的业务场景来做代码设计,其实也都需要遵循 OOP 模型。

总结

​ 学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。

你可能感兴趣的:(设计模式7大原则)