基于抽象而非实现编程
创始人
2025-05-28 02:30:38
0

我们在定义接口的时候,命名要通用, 不能包含和具体实现相关的字眼,和特定实现有关的方法不要放在接口中

public class AliyunImageStore {//...省略属性、构造函数等...public void createBucketIfNotExisting(String bucketName) {// ...创建bucket代码逻辑...// ...失败会抛出异常..}public String generateAccessToken() {// ...根据accesskey/secrectkey等生成access token}public String uploadToAliyun(Image image, String bucketName, String accessToken) {//...上传图片到阿里云...//...返回图片存储在阿里云上的地址(url)...}public Image downloadFromAliyun(String url, String accessToken) {//...从阿里云下载图片...}
}// AliyunImageStore类的使用举例
public class ImageProcessingJob {private static final String BUCKET_NAME = "ai_images_bucket";//...省略其他无关代码...public void process() {Image image = ...; //处理图片,并封装为Image对象AliyunImageStore imageStore = new AliyunImageStore(/*省略参数*/);imageStore.createBucketIfNotExisting(BUCKET_NAME);String accessToken = imageStore.generateAccessToken();imagestore.uploadToAliyun(image, BUCKET_NAME, accessToken);}}}

上面例子,如果我们把实现类换成私有云,就不好处理修改了

AliyunImageStore 这个名字不好,带有 Aliyun ,函数实现不能暴露细节
generateAccessToken 私有云没有token ,这个要修改业务流程,
createBucketIfNotExisting 这一段处理不该暴露 封装具体的实现细节

我们替换下实现

public interface ImageStore {String upload(Image image, String bucketName);Image download(String url);
}

对应使用者来说,他只需要知道 upload 和download 就好了,

public void process() {Image image = ...;//处理图片,并封装为Image对象ImageStore imageStore = new PrivateImageStore(...);imagestore.upload(image, BUCKET_NAME); }

使用时,需要new具体的实现类,

这一点 如果替换实现类,还需要修改多处引用代码,可以重构掉

比如,借助 spring bean 发现功能

交由Spring容器管理此实现类,如果需要修改,修改此处代码重启即可

@Bean public ImageStore getImageStore() {return new PrivateImageStore(/*省略构造函数*/);}

或者使用简单工厂+反射实现

相关内容

热门资讯

深入理解 Go map (1)... 基本原理 go中的map底层用如下结构表示: type hmap struct {//...
JAVA并发编程之锁 1、乐观锁和悲观锁 1.1、悲观锁 认为自己在使用数据的时候一定有别的线程来修改数据,...
嘉应制药融资净偿还1977.4... 雷达财经雷助吧出品 文|吴墨 编|深海 东财Choice数据显示,5月29日,嘉应制药融资买入116...
全球首个!国际调解院落户中国香... 5月30日上午,国际调解院公约签署仪式在中国香港举行。 据中国外交部介绍,2022年,中国与近20个...
《广西壮族自治区法律援助条例》... 人民网南宁5月30日电 (记者覃心)5月29日,广西壮族自治区人大常委会在广西人民会堂召开新闻发布会...
Vue使用的编辑器 作者简介:一名计算机萌新、前来进行学习VUE,让我们一起进步吧。   座右铭...
《计算机网络:自顶向下方法》学... 控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如...
DDD很难,学不会怎么办? 你好,我是这门课的编辑小新。 ** ** 不知不觉,我们的课程已经接近尾...
cdn原理与应用 免费的ChatGPT镜像网站网页搜索技巧 | 西园公子的科研百宝箱 (zwjjiaozhu.top)...
快递寄丢5万元手镯仅赔67元?... 封面新闻记者 马梦飞 5月30日,#顺丰寄丢价值5万元手镯仅赔67元#的话题登上热搜,引发广泛热议。...