面向對象設計原則——开闭原则
什么是开闭原则
开闭原则(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(); } }
这样子,如果我们新增加了不同的电脑类型,只需要实现两个接口就行了,就不需要修改原有的代码