开闭原则|设计原则(二)

简介: 由于在软件体系中,唯一不变的,就是软件一直在变。

然后第二部分,我们需要 将 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);
    }
}
复制代码

如上,一个遵从开闭原则的代码就写好了

当我们要添加新功能时候,我们只需更改以下几点

  1. 添加 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;//修改
    ...
}
复制代码
  1. 继承新的 work 子类
puvlic class CWork extends BaseWork{
    public CWork(WorkBean workBean){
        super(work);
    }
    @Override
    public process(Processbean processbean){
        workBean.getC().actionC(processbean.getProcessC);
    }
}
复制代码
  1. 代码执行处直接添加
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);
    }
}
复制代码

辩证认清开闭原则

如上文,我们学习了如何写出具有开闭原则的代码。事实上,我们利用接口,多态等特性,写出 对拓展开发,对修改关闭 的代码都是具有开闭原则的代码。

但是我们从上文的例子也可以看出,我们所说的 对修改关闭 指的并非不允许修改,而是不修改核心代码,修改不会造成其他位置出现问题。这些代码就是优质的 可拓展 的代码。

并且,我们可以看到,为了写出这类易于拓展,符合开闭原则的代码,我们是降低了其可读性,且花费了些思考和时间成本才写出来的。所以,如果确定代码无需拓展,便不应该使用开闭原则,免得画蛇添足。

实事求是,适合需求的代码,就是优质好代码。

相关文章
|
设计模式 关系型数据库 数据安全/隐私保护
软件架构设计原则之单一职责原则
单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个类负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能导致另一个职责的功能发生故障。这样一来,这个类就存在两个导致类变更的原因。如何解决这个问题呢?将两个职责用两个类来实现,进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。总体来说,就是一个类、接口或方法只负责一项职责。
113 0
软件架构设计原则之单一职责原则
|
设计模式 人工智能 前端开发
七大设计原则之开闭原则应用
七大设计原则之开闭原则应用
79 0
|
6月前
|
设计模式 关系型数据库
【设计模式】软件设置原则-开闭原则
【1月更文挑战第12天】【设计模式】软件设置原则-开闭原则
|
6月前
|
设计模式 存储 NoSQL
【设计模式】软件设计原则-单一职责原则
【1月更文挑战第12天】【设计模式】软件设计原则-单一职责原则
|
关系型数据库 测试技术 程序员
面向对象设计原则~~~开闭原则
面向对象设计原则~~~开闭原则
87 0
|
设计模式 人工智能 前端开发
软件架构设计原则之开闭原则
开闭原则(Open-Closed Principle,OCP)是指一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。它强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性及可维护性。开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定、灵活的系统。例如版本更新,我们尽可能不修改源代码,但是可以增加新功能。
130 0
|
设计模式 关系型数据库
软件架构设计原则之里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为T1的对象o1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
78 0
|
设计模式 关系型数据库
软件架构设计原则之接口隔离原则
接口隔离原则符合我们常说的高内聚、低耦合的设计思想,可以使类具有很好的可读性、可扩展性和可维护性。我们在设计接口的时候,要多花时间去思考,要考虑业务模型,包括对以后有可能发生变更的地方还要做一些预判。所以,对于抽象、对于业务模型的理解是非常重要的。下面我们来看一段代码,对一个动物行为进行抽象描述。
97 0
|
设计模式 安全 Java
设计原则之接口隔离原则
设计原则之接口隔离原则
71 0
设计原则之接口隔离原则
|
设计模式 安全 Java
设计原则之依赖倒置原则
设计原则之依赖倒置原则
78 0
设计原则之依赖倒置原则