然后第二部分,我们需要 将 Work 类抽象出一个父类来,然后每个功能都是继承该父类来实现。
public abstract class BaseWork{ protected WorkBean workBean; public Work(WorkBean workBean){ this.workBean = workBean; } public abstract void process(Processbean processbean); } 复制代码
//对应的子类继承父类 puvlic class AWork extends BaseWork{ public AWork(WorkBean workBean){ super(work); } @Override public process(Processbean processbean){ workBean.getA().actionA(processbean.getProcessA); } } puvlic class BWork extends BaseWork{ public BWork(WorkBean workBean){ super(work); } @Override public process(Processbean processbean){ workBean.getB().actionB(processbean.getProcessB); } } 复制代码
最后再使用一个 ActionList 类来执行上述的子类,利用这个类可以很方便的新增和执行对应的 Work
public class ActionList{ private List<BaseWork> list = new ArrayList<>(); public void add(BaseWork work){ list.add(work); } puclic void actionWork((Processbean processbean){ for(BaseWork work : list){ work.process(processbean); } } } 复制代码
我们最后将代码进行整合应用,贪简单这样子写
public class HappyNationalDay{ public static void main(String[] args) { ActionList list = new ActionList(); WorkBean bean = new WorkBean(); ...//bean的设置 list.add(new AWork(bean)); list.add(new BWork(bean)); Processbean processbean = new Processbean(); ...//processbean的设置 list.actionWork(processbean); } } 复制代码
如上,一个遵从开闭原则的代码就写好了
当我们要添加新功能时候,我们只需更改以下几点
- 添加
bean 类
属性
public class WorkBean{ private A a; private B b; private C c;//修改 ... ... } public class Processbean{ private String processA; private String processB; private String processC;//修改 ... } 复制代码
- 继承新的
work
子类
puvlic class CWork extends BaseWork{ public CWork(WorkBean workBean){ super(work); } @Override public process(Processbean processbean){ workBean.getC().actionC(processbean.getProcessC); } } 复制代码
- 代码执行处直接添加
public class HappyNationalDay{ public static void main(String[] args) { ActionList list = new ActionList(); WorkBean bean = new WorkBean(); ... list.add(new AWork(bean)); list.add(new BWork(bean)); list.add(new CWork(bean));//修改 Processbean processbean = new Processbean(); ... list.actionWork(processbean); } } 复制代码
辩证认清开闭原则
如上文,我们学习了如何写出具有开闭原则的代码。事实上,我们利用接口,多态等特性,写出 对拓展开发,对修改关闭 的代码都是具有开闭原则的代码。
但是我们从上文的例子也可以看出,我们所说的 对修改关闭 指的并非不允许修改,而是不修改核心代码,修改不会造成其他位置出现问题。这些代码就是优质的 可拓展 的代码。
并且,我们可以看到,为了写出这类易于拓展,符合开闭原则的代码,我们是降低了其可读性,且花费了些思考和时间成本才写出来的。所以,如果确定代码无需拓展,便不应该使用开闭原则,免得画蛇添足。
实事求是,适合需求的代码,就是优质好代码。