设计模式七大原则之开闭原则
什么是开闭原则
开闭原则是编程中最基础、最重要的设计原则,是设计模式的核心。
开闭原则是指:对扩展开放,对修改封闭。
也就是说,当软件需要变化时,尽量通过扩展软件实体的行为的方法来实现,而不是在现有代码的基础上做出修改来实现。
举个栗子
假设现在我们希望有一个类,可以根据传入的类不同,输出其类型:
public class Ocp {
public static void main(String[] args) {
Worker worker = new Worker();
worker.work(new A());
worker.work(new B());
}
}
class Worker {
public void work(Base base) {
if (base instanceof A) {
print1();
} else if (base instanceof B) {
print2();
}
}
public void print1() {
System.out.println("这是A类");
}
public void print2() {
System.out.println("这是B类");
}
}
class Base { }
class A extends Base { }
class B extends Base { }
现在我们希望添加一个C类,我们就需要改变我们的代码:
public class Ocp {
public static void main(String[] args) {
Worker worker = new Worker();
worker.work(new A());
worker.work(new B());
worker.work(new C());
}
}
class Worker {
public void work(Base base) {
if (base instanceof A) {
print1();
} else if (base instanceof B) {
print2();
} else if (base instanceof C) {
print3();
}
}
public void print1() {
System.out.println("这是A类");
}
public void print2() {
System.out.println("这是B类");
}
public void print3() {
System.out.println("这是C类");
}
}
class Base { }
class A extends Base { }
class B extends Base { }
class C extends Base { }
这里面有着过多的改动,我们添加了一个类,修改了Worker类里的work逻辑,并增加了一个新的方法,如果功能更复杂的话要改动的东西太多,不利于维护。现在的代码是对修改开放的,并不符合开闭原则。
下面的代码是符合开闭原则的:
class Worker {
public void work(Base base) {
base.print();
}
}
abstract class Base {
public abstract void print();
}
class A extends Base {
@Override
public void print() {
System.out.println("这是A类");
}
}
class B extends Base {
@Override
public void print() {
System.out.println("这是B类");
}
}
class C extends Base {
@Override
public void print() {
System.out.println("这是C类");
}
}
对于现在的代码来说,将Base作为一个抽象类,让子类重写其print方法,如果需要添加新的功能,仅需要继承Base类即可,Worker类中的work方法也仅仅是调用一下base的print方法,不会因为新增功能而被迫改变,对扩展开放,对修改封闭,符合开闭原则。