面向對象設計原則——开闭原则

什么是开闭原则

开闭原则(Open Closed Principle,OCP),软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。

软件实体包括:模块,类与接口,方法。

更加清晰的定义:

当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。

 

 

实现方法

通过“抽象约束、封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,

而将相同的可变因素封装在相同的具体实现类中。

当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

 

例子:

/**
 * 电脑抽象接口
 */
public interface Computer {
}

 

/**
 * 电脑具体实现1
 */
public class Macbook implements Computer{
}

 

/**
 * 电脑实现具体2
 */
public class Surface implements Computer {
}

 

/**
 * 生产电脑的类
 */
public class ComputerFactory {

    /**
     * 根据字符串得到不同类型的电脑
     * @param type
     * @return
     *
     * 注意:如果我们添加了新的电脑类型,那我们就需要修改这个方法。
     * 违背了开闭原则
     */
    public Computer produceComputor(String type){
        Computer computer = null;
        if (type.toUpperCase().equals("MACBOOK")){
            computer = new Macbook();
        }else if (type.toLowerCase().equals("surface")){
            computer = new Surface();
        }
        return computer;
    }
}

如果我需要增加一个电脑类型,那就需要修改方法:违背了开闭原则

 

改进方法,讲ComputerFactory抽象为接口,利用不同的工厂实现不同电脑的创建。

实际就是工厂方法模式的设计模式

 

public interface CFactory {
    public Computer produceComputor();
}

 

/**
 * 继承抽象工厂类,实现创建macbook
 */
public class MacFactory implements CFactory {
    public Computer produceComputor() {
        return new Macbook();
    }
}

 

/**
 * 继承抽象工厂类,实现Surface创建
 */
public class MSFactory implements CFactory {
    public Computer produceComputor() {
        return new Surface();
    }
}

这样子,如果我们新增加了不同的电脑类型,只需要实现两个接口就行了,就不需要修改原有的代码

 

posted @ 2020-09-13 22:37  小丑quan  阅读(133)  评论(0)    收藏  举报