OOP 面向对象 七大原则 ---- 开闭原则(记录)

295 阅读3分钟

一、含义

对修改关闭,对扩展开放。

开闭原则是编程中最基础,最核心的原则。就是指类或者模块或者软件对扩展开放,对修改关闭。用抽象去搭建框架,用实现去扩展细节,当软件功能需要发生变化时,应该使用扩展的方式去应对变化,而不是修改原有的逻辑去应对变化。

二、开闭原则 反例

package principle.OCP;

/**
 * @Description 开闭原则:反例。
 *                  这种就是典型地违反了设计模式的开闭原则的例子,在本例中如果要新增新的类型的机动车的生产,则需要去修改大量的使用方的逻辑和
 *              新增提供方的逻组。开闭原则要求是在应对新的需求产生的变更时应该尽量不修改代码或者少修改代码,特别是对于使用方来说应该尽可
 *              能完全不修改代码,比如在本例中我们要新增加生产拖拉机和生产中巴车的功能,需要修改的地方很多,特别是在使用方的修改星特别大
 * @Author wangzhan
 * @Date 2022/3/7
 */
public class OpenClosedPrincipleCounterexample {
    public static void main(String[] args) {
        // 创建机动车生产者类对象
        MotorVehicleProduction mvp = new MotorVehicleProduction();

        // 生成一辆大巴车
        mvp.product(new Bus());
        // 生成一辆小轿车
        mvp.product(new SedanCar());
    }
}

/**
 * 机动车生产者类(使用方)
 */
class MotorVehicleProduction {
    /**
     * 接收一个机动车对象,然后根据类型去决定生成哪种具体的机动车
     */
    public void product(MotorVehicle mv){
        if (mv.type == 1){
            productBus(mv);
        }else if (mv.type == 2){
            productSedanCar(mv);
        }
    }

    // 生产大巴车
    public void productBus(MotorVehicle mv){
        System.out.println("生产" + mv.name + "=======");
    }

    // 生产小轿车
    public void productSedanCar(MotorVehicle mv){
        System.out.println("生产" + mv.name + "------");
    }
}

/**
 * 机动车类
 */
class MotorVehicle {

    protected int type;

    protected String name;
}

/**
 *  大巴车类
 *
 */
class Bus extends MotorVehicle {

    Bus(){
        super.type = 1;
        super.name = "大巴车";
    }
}

/**
 *  小轿车类
 *
 */
class SedanCar extends MotorVehicle {

    SedanCar(){
        super.type = 2;
        super.name = "小轿车";
    }
}

三、开闭原则 正例

package principle.OCP;

/**
 * @Description 开闭原则:对修改关闭,对扩展开放。
 *                      开闭原则是编程中最基础,最核心的原则。就是指类或者模块或者软件对扩展开放,对修改关闭。用抽象去搭建框架,
 *                      用实现去扩展细节,当软件功能需要发生变化时,应该使用扩展的方式去应对变化,而不是修改原有的逻辑去应对变化。
 * @Author wangzhan
 * @Date 2022/3/7
 */
public class OpenClosedPrinciple {

    public static void main(String[] args) {
        // 创建机动车生产者类对象
        MotorVehicleProduction1 mvp = new MotorVehicleProduction1();

        // 生成一辆大巴车
        mvp.product(new Bus1());
        // 生成一辆小轿车
        mvp.product(new SedanCar1());
        // 扩展生产: 拖拉机
        mvp.product(new Tractor());
    }
}


/**
 * 机动车生产者类(使用方)
 */
class MotorVehicleProduction1 {
    /**
     * 接收一个机动车对象,然后根据类型去决定生成哪种具体的机动车
     */
    public void product(MotorVehicle1 mv){
        /**
         * 1、避免在类中使用if....else
         * 2、避免增加新功能和需求有变更的时候去修改源代码
         */
        mv.product();
    }

}

/**
 * 机动车类
 */
abstract class MotorVehicle1 {

    protected int type;

    protected String name;

    protected abstract void product();
}

/**
 *  大巴车类
 *
 */
class Bus1 extends MotorVehicle1 {

    Bus1(){
        super.type = 1;
        super.name = "大巴车";
    }

    @Override
    protected void product() {
        System.out.println("生产" + this.name + "======");
    }
}

/**
 *  小轿车类
 *
 */
class SedanCar1 extends MotorVehicle1 {

    SedanCar1(){
        super.type = 2;
        super.name = "小轿车";
    }

    @Override
    protected void product() {
        System.out.println("生产" + this.name + "------");
    }
}

/**
 * 扩展生成拖拉机
 *
 * 拖拉机类
 */
class Tractor extends MotorVehicle1 {

    Tractor(){
        super.name = "拖拉机";
    }

    @Override
    protected void product() {
        System.out.println("生产" + this.name + "%%%%%%");
    }
}

四、内容对比

image.png