设计模式之美(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-接口的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之美(c++)-笔记-48-代理模式

设计模式之美(c++)-笔记-51-适配器模式

设计模式之美(c++)-笔记-51-适配器模式

设计模式之美(c++)-笔记-56-观察者模式

设计模式之美(c++)-笔记-56-观察者模式

设计模式之美(c++)-笔记-10-组合