使用适配器设计模式
Using Adapter Design Pattern
我正在实现一个适配器设计模式,以利用现有的类。我的问题是,这些类的工作原理几乎相同,但名称不同,在另一个类上的功能更少。
例如,Work类和Homework每个类都有一个执行相同操作的函数,即doWork()和doHomework()
我可以将这些链接到Task界面中的doThis()。但是,Work类没有done()函数,而Homework有它。我该如何处理这个问题?只是没有实现?有什么更好的方法吗?
class Task {
public:
virtual int doThis() = 0;
virtual bool done() = 0;
};
class Work {
public:
Work();
int doWork();
};
class Homework {
public:
Homework();
int doHomework();
bool done();
bool isDone;
};
class WorkAdapter : public Task, private Work {
public:
WorkAdapter();
int doThis() {
return doWork();
}
virtual bool done() {
// Is this okay not to implment this?
}
};
class HomeworkAdapter : public Task, private Homework {
public:
HomeworkAdapter();
int doThis() {
return doWork();
}
virtual bool done() {
return isDone;
}
};
int main() {
Task *homework = new HomeworkAdapter();
Task *work = new WorkAdapter();
homework->doThis();
bool isHomeworkDone = homework->done();
work->doThis();
bool isWorkDone = work->done(); // This would never be called in my implementation...
}
使用多重继承的适配器实现(目标为public,适配器为private)是一种有效的方法。
只需注意函数的返回类型:
class HomeworkAdapter : public Task, private Homework {
public:
HomeworkAdapter() {}
int doThis() override { // make sure you override target member
return doWork(); // and return value as expected
}
bool done() override {
return isDone;
}
};
提示:不需要在派生类中指定virtual。相反,使用重写是值得的,只是为了避免在参数或返回类型不匹配的情况下出现微妙的问题
当适配器中没有可用于处理done()
的功能时,您必须模仿它。因此,这不仅仅是为了更改名称,还需要确保类似的行为:
class WorkAdapter : public Task, private Work {
bool isdone; // functionality to add
public:
WorkAdapter() : isdone(false) {}
int doThis() override {
auto rc = doWork();
isdone = true; // once it's done, it's done ;-)
return rc;
}
bool done() override {
return isdone; // you must add this
}
};
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 用于在回调中调用解析器的设计模式
- 创建包装升压适配器的自定义范围类
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在 C++20 中将多个范围适配器连接到一个范围中
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 克隆设计模式适配器 - 避免切片子项(类似于原型模式)
- 适配器模式:支持可以是const或非const的基础数据,优雅
- 适配器模式:为什么我们需要将Adaptee子类化
- C/C++:使用适配器模式是否会降低性能
- 使用适配器设计模式
- 设计模式-适配器和桥接器之间的区别
- 实现适配器设计模式时链接器错误