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

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

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

辩证认清开闭原则

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

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

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

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

目录
打赏
0
0
0
0
97
分享
相关文章
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群
【阿里云云原生专栏】低代码开发在云原生平台的应用:阿里云低代码服务探索
【5月更文挑战第27天】在云原生时代,低代码开发凭借其图形化界面和预构建模块,简化了应用开发,提升了效率。阿里云积极探索低代码领域,推出函数计算FC和应用配置中心ACM等服务。FC让开发者无需关注基础设施,仅需少量代码即可实现应用部署,而ACM则提供动态配置管理,增强应用灵活性。阿里云的这些服务为企业数字化转型提供了高效、安全的解决方案,预示着低代码开发在云原生平台上的重要地位。
336 1
一篇文章讲明白Jetty使用教程(一)——开始使用Jetty
一篇文章讲明白Jetty使用教程(一)——开始使用Jetty
434 0
【汇编】在代码段使用数据,在代码段使用栈
【汇编】在代码段使用数据,在代码段使用栈
570 0
【汇编】在代码段使用数据,在代码段使用栈
【Web 前端】如何找到所有 HTML select 标签的选中项?
【5月更文挑战第2天】【Web 前端】如何找到所有 HTML select 标签的选中项?
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问