设计规则之里氏替换原则

tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

相关规则:

推荐:体系化学习Java(Java面试专题)

1.6大设计规则-迪米特法则
2.6大设计原则-接口隔离原则
3.6大设计规则-开闭原则
4.6大设计规则-单一职责原则
5.6大设计规则-依赖倒置原则

文章目录

  • 里氏替换原则

里氏替换原则

里氏替换原则 Liskov Substiution Principle ,简称 LSP。怎么理解这个原则呢,《设计模式之禅》第二章介绍它有两种定义:

1、If for each object ol of type S there is an object o2 oftype T such that for all programs P defined in terms of T, the behavior of P is unchangedwhen o1 is substituted for o2 then S is a subtype of T.
如果对每一个类型为S的对象ol,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。

这句话有点晦涩,简单来说就是 T 是父类,S 是子类,在一段代码中,将 T 替换成 S ,代码的逻辑并没发生任何变化。

2、Functions that use pointers or references to base classes must be able to useobjects of derived classes without knowing it. 所有引用基类的地方必须透明的使用其子类的对象。
这句话的意思呢,跟上面的差不多,就父类出现的地方,换成子类,代码不会异常,但是如果反过来,子类出现的地方,要是换成父类,那么就有可能出错了。

参考下面的例子:
我们可以将保时捷换成法拉利,并没有改变 User 类的代码逻辑,依然是先 先点火,在驾驶,这就是里氏替换原则的第一个定义。

package com.pany.camp.design.principle.lsp;

/**
 *
 * @description:  车子的抽象类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: panyong 
 * @version: 1.0.0 
 * @createTime: 2023-05-31 13:26
 */
public abstract class Car {

    /**
     * 启动
     *
     * @since 1.0.0
     * @param
     * @return: void
     * @author: panyong
     * @version: 1.0.0
     * @createTime: 2023-05-31 13:28
     */
    abstract void firing();

    /**
     * 车子的牌子
     *
     * @since 1.0.0
     * @param
     * @return: String
     * @author: pany
     * @version: 1.0.0
     * @createTime: 2023-05-31 13:36
     */
    abstract String getName();
}

package com.pany.camp.design.principle.lsp;
/**
 *
 * @description:  保时捷
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-05-31 13:30
 */
public class Porsche extends Car {
    
    @Override
    void firing() {
        System.out.println("drive porsche");
    }

    @Override
    String getName() {
        return "porsche";
    }
}

package com.pany.camp.design.principle.lsp;

/**
 *
 * @description: 法拉利
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-05-31 13:40
 */
public class Ferrari extends Car {
    @Override
    void firing() {
        System.out.println("drive ferrari");
    }

    @Override
    String getName() {
        return "ferrari";
    }
}

package com.pany.camp.design.principle.lsp;

public class User {

    public void drive(Car car) {
        car.firing();
        System.out.println("drive " + car.getName());
    }

    public static void main(String[] args) {
        User user = new User();

        // 我可以换成其他的方式,并没有改变代码的逻辑
        user.drive(new Porsche());
        user.drive(new Ferrari());
    }
}


你可能感兴趣的:(设计规则和模式,里氏替换原则,java,开发语言)