设计模式开闭原则
今天我们聊设计模式中的开闭原则,即“一个软件实体应当对扩展开放,对修改关闭。即软件 实体应尽量在不修改原有代码的情况下进行扩展。”,不修改原有的代码就是新增类。我以配置数据源为例,假设我们有两个数据源,未来还可能新增一个数据源,我们应当如何写配置类呢?
1.写抽象配置类
@Datapublic 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合并
能完全避免,而是想说能避免的冲突应该尽量避免,这就好像异步编程一样,如果在这一情况下能够做到纯异步,为什么非要加锁呢?
以上是 设计模式开闭原则 的全部内容, 来源链接: utcz.com/z/512208.html