设计模式-开闭原则

流过昼夜 提交于 2019-12-30 11:51:09

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

  今天我们聊设计模式中的开闭原则,即“一个软件实体应当对扩展开放,对修改关闭。即软件 实体应尽量在不修改原有代码的情况下进行扩展。”,不修改原有的代码就是新增类。我以配置数据源为例,假设我们有两个数据源,未来还可能新增一个数据源,我们应当如何写配置类呢?

1.写抽象配置类

@Data
public abstract class AbstractDataSource {
    private String url;
    private String username;
    private String password;
    private String driverClassName;
	
	public DataSource createDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
		druidDataSource.setDriverClassName(getDriverClassName());
        druidDataSource.setUrl(getUrl());
        druidDataSource.setUsername(getUsername());
        druidDataSource.setPassword(getPassword());
	}
}

2.通过新增类的方式创建一个新的数据源对象

  假设我们有一个苹果数据源只需要配置这些基础配置,那么,它直接继承,然后写入property即可。

@ConfigurationProperties(prefix = "spring.datasource.apple")
@Component
public class AppleDataSource extends AbstractDataSource{
}

  然而世界是多元化的,现在,香蕉数据源想设置回收超时连接 。那么可以这样写:

@ConfigurationProperties(prefix = "spring.datasource.banana")
@Component
public class BananaDataSource extends AbstractDataSource{
	
	public DataSource createDataSource() {
		DruidDataSource druidDataSource = (DruidDataSource)super.createDataSource();
	    druidDataSource.setRemoveAbandoned(true);
	    return druidDataSource;
	}
}

3.修改可控,新增则添加类

  现在,如果需要新增一个数据源,我们只需要新增一个类继承抽象数据源即可,比如新增PeachDataSource。当然了,如果非要修改苹果数据源,我们只需要修改AppleDataSource,影响代码较少,这会使得代码可控,这符合“单一职责原则”,单一职责原则如下:

一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

  对于“单一职责原则”,我举一个简单的情况:假设AppleDataSource、PeachDataSource都需要新增设置各自的最大连接数,如果我们没有写成两个类,而是统一写在DataSourceConfig类中。程序员甲和程序员乙都因为自己的业务需要修改配置,甲要修改苹果数据源,乙要修改桃子数据源,此时两个人操作了同一个类DataSourceConfig,git合并时立即出现冲突,组长就需要召集正在工作的两人进行合并。我不是说git合并能完全避免,而是想说能避免的冲突应该尽量避免,这就好像异步编程一样,如果在这一情况下能够做到纯异步,为什么非要加锁呢?

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!