设计模式开闭原则

编程

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

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合并能完全避免,而是想说能避免的冲突应该尽量避免,这就好像异步编程一样,如果在这一情况下能够做到纯异步,为什么非要加锁呢?

以上是 设计模式开闭原则 的全部内容, 来源链接: utcz.com/z/512208.html

回到顶部