设计模式之美(c++)-笔记-09-接口
Posted 欢乐的企鹅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之美(c++)-笔记-09-接口相关的知识,希望对你有一定的参考价值。
1.“基于接口而非实现编程”,这条原则的另一个表述方式,是“基于抽象而非实现编程”。后者的表述方式其实更能体现这条原则的设计初衷。我们在做软件开发的时候,一定要有抽象意识、封装意识、接口意识。越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性、扩展性、可维护性。
2. 我们在定义接口的时候,一方面,命名要足够通用,不能包含跟具体实现相关的字眼;另一方面,与特定实现有关的方法不要定义在接口中。
3.“基于接口而非实现编程”这条原则,不仅仅可以指导非常细节的编程开发,还能指导更加上层的架构设计、系统设计等。比如,服务端与客户端之间的“接口”设计、类库的“接口”设计。
原始代码:
namespace MODULE_09_NAMESPACE{
struct Image{
Image(){}
};
class AliyunImageStore {
public:
//...省略属性、构造函数等...
void createBucketIfNotExisting(string bucketName) {
// ...创建bucket代码逻辑...
// ...失败会抛出异常..
}
string generateAccessToken() {
// ...根据accesskey/secrectkey等生成access token
return string();
}
string uploadToAliyun(Image image, string bucketName, string accessToken) {
//...上传图片到阿里云...
//...返回图片存储在阿里云上的地址(url)...
return string();
}
Image downloadFromAliyun(string url, string accessToken) {
//...从阿里云下载图片...
return Image();
}
};
// AliyunImageStore类的使用举例
class ImageProcessingJob {
public:
static string BUCKET_NAME;
//...省略其他无关代码...
void process() {
Image image; //处理图片,并封装为Image对象
AliyunImageStore* imageStore = new AliyunImageStore(/*省略参数*/);
imageStore->createBucketIfNotExisting(BUCKET_NAME);
string accessToken = imageStore->generateAccessToken();
imageStore->uploadToAliyun(image, BUCKET_NAME, accessToken);
}
};
string ImageProcessingJob::BUCKET_NAME = "ai_images_bucket";
}//MODULE_09_NAMESPACE
代码改进之后:
namespace MODULE_09_NAMESPACE_PLUS{
struct Image{
Image(){}
};
//interface
class ImageStore{
public:
virtual ~ImageStore() {};//此处应该是虚析构函数
virtual string upload(Image image,string bucketName) = 0;
virtual Image download(string url) = 0;
};
class AliyunImageStore : public ImageStore{
public:
string upload(Image image,string bucketName){
createBucketIfNotExisting(bucketName);
string accessToken = generateAccessToken();
//...上传图片到阿里云...
//...返回图片存储在阿里云上的地址(url)...
return string();
}
Image download(string url) {
string accessToken = generateAccessToken();
//...从阿里云下载图片...
return Image();
}
private:
//...省略属性、构造函数等...
void createBucketIfNotExisting(string bucketName) {
// ...创建bucket代码逻辑...
// ...失败会抛出异常..
}
string generateAccessToken() {
// ...根据accesskey/secrectkey等生成access token
return string();
}
};
// 上传下载流程改变:私有云不需要支持access token
class PrivateImageStore : public ImageStore {
public:
string upload(Image image, string bucketName) {
createBucketIfNotExisting(bucketName);
//...上传图片到私有云...
//...返回图片的url...
return string();
}
Image download(string url) {
//...从私有云下载图片...
return Image();
}
private:
void createBucketIfNotExisting(string bucketName) {
// ...创建bucket...
// ...失败会抛出异常..
}
};
// AliyunImageStore类的使用举例(业务)
class ImageProcessingJob {
public:
const string BUCKET_NAME = "ai_images_bucket";
//...省略其他无关代码...
void process() {
Image image; //处理图片,并封装为Image对象
shared_ptr<ImageStore> imageStore = make_shared<AliyunImageStore>(/*省略参数*/);
imageStore->upload(image, BUCKET_NAME);
}
};
}
以上是关于设计模式之美(c++)-笔记-09-接口的主要内容,如果未能解决你的问题,请参考以下文章