个人看书理解,主要是写代码实操,方便以后复习,而不是文字性的东西

开闭原则OCP

  • 定义
    对扩展开放,对修改关闭。
    用抽象构建框架,用实现扩展细节,核心思想是面向抽象。
    禁止修改上曾的抽象,但是可以用继承拓展底层的实现功能

  • 目的
    不修改源代码,灵活拓展新功能
    image.png

代码

interface IA {
    void doIA();
}

interface IB {
    void doIB();
}

class CA implements IA {

    @Override
    public void doIA() {

    }
}

class CB extends CA implements IB {
    @Override
    public void doIA() {
//        super.doA();
        //TODO 修改的逻辑
    }

    @Override
    public void doIB() {

    }
}

当需要对CA的功能进行修改时,为确保不影响其他使用CA的模块,应该使用CB继承CA同事实现新的功能拓展接口IB。IB的接口即为抽象出来的拓展功能接口

依赖倒置原则DIP

  • 定义
    高层模块不依赖底层模块,而是都依赖于其抽象
    抽象不依赖细节,细节依赖抽象

  • 目的
    降低类之间的耦合性

代码

image.png

interface IA {
    void doIA();
}

class CA implements IA {

    @Override
    public void doIA() {

    }
}

class CB implements IA {

    @Override
    public void doIA() {

    }
}

class Client {
    private IA ia;

    //构造注入
    public Client(IA ia) {
        this.ia = ia;
    }

    //setter注入
    public void setIa(IA ia) {
        this.ia = ia;
    }

    void doClient() {
        ia.doIA();
    }

    public static void main(String[] args) {
        //构造注入
        Client client = new Client(new CA());
        client.doClient();
        //setter注入
        client.setIa(new CB());
        client.doClient();
    }
}

面向接口变成,先顶层抽象,再具体细节,

单一职责原则SRP

  • 定义
    一个Class、Interface、Method只负责一项职责,如果类变更应该也只存在单个职责原因变更
  • 目的
    降低类的复杂度、提高可读性、可维护性

代码

image.png

interface IA{
    void doIA();
}
interface IB{
    void doIB();
}

class CA implements IA,IB{

    @Override
    public void doIA() {

    }

    @Override
    public void doIB() {

    }
}

类的单一职责收到依赖、组合、聚合等关系的影响很难保证单一职责,
应让接口、方法等抽象和细节保证单一职责

接口隔离原则ISP

  • 定义
    应使用多个接口、不应使用单一的总接口、不依赖不需要的接口
    类的依赖建立在最小接口上
    建立单一接口
    细化接口、减少接口的方法,这建立在业务的抽象理解上
  • 目的
    具有高内聚、低耦合、可读性、可扩展性、可维护性

代码

image.png

interface WalkRebot {
    void doWale();
}

interface JobRebot {
    void doJob();
}

interface DriveRebot {
    void doDrive();
}

class MyRobot implements WalkRebot, JobRebot, DriveRebot {
    @Override
    public void doWale() {
        
    }

    @Override
    public void doJob() {

    }

    @Override
    public void doDrive() {

    }
}

其要求有更高的抽象性,将共性、非共性的特征抽象出来

迪米特法则LoD

  • 定义
    最少知道原则LKP,对象之间应保持最少的了解
  • 目的
    降低对象和对象、类和类之间的耦合性,禁止滥用继承

代码

class CA {
    void doCA() {
        //doSomething
    }
}

class CB {
    void doCB() {
        //doSomething
        new CA().doCA();
    }
}

class CC {
    void doCC() {
        new CB().doCB();
    }
}

class Client {
    public static void main(String[] args) {
        new CC().doCC();
    }
}

客户端只需要CC去执行方法,而不用去关注CC是怎么去执行的,CC和CA是解耦的

里氏替换原则LSP

  • 定义
    如果适用于父类,则一定适用于子类,所有引用父类的地方都可以使用其子类对象,子类对象可以替换父类对象而保持逻辑不变
    1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
    2.子类可以增加自己的方法
    3.子类的重写父类方法时,其条件必须不能比父类严格,可以宽松

合成复用原则CARP

  • 定义
    尽量使用对象组合、聚合实现代码复用,其优先级高于继承
    1.组合聚合可以使类与类耦合度降低
    2.继承把细节暴露给子类,增加了代码复杂度
  • 目的
    降低耦合度

代码

class CA implements IA {

    @Override
    public void doIA() {

    }
}

class CB implements IA {

    @Override
    public void doIA() {

    }
}

class Client {
    private IA ia;

    public Client(IA ia) {
        this.ia = ia;
    }

    public void doClient() {
        ia.doIA();
    }
}







这个家伙很懒,啥也没有留下😋