使用适配器设计模式
Using Adapter Design Pattern
我正致力于实施适配器设计模式以利用现有的 classes。我的问题是,classes 的工作原理几乎相同,但名称不同且功能较少。
例如,每个 Work class 和 Homework class 都有一个功能相同,这是 doWork() 和 doHomework().
我可以 link 这些到 doThis() 在 Task 界面。但是,Work class 没有 done() 函数,而 Homework class 有它。我将如何处理这个问题?只是没有实施?有没有更好的方法?
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...
}
使用多重继承的 adapter 实现(public 用于目标,私有用于适配器)是一种有效的方法。
只需注意函数的 return 类型:
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;
}
};
提示:不需要在派生的 class 中指定虚拟。相反,值得使用覆盖,只是为了避免在参数不匹配或 return 类型的情况下出现细微问题。
当被适配者没有可用于照顾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
}
};
我正致力于实施适配器设计模式以利用现有的 classes。我的问题是,classes 的工作原理几乎相同,但名称不同且功能较少。
例如,每个 Work class 和 Homework class 都有一个功能相同,这是 doWork() 和 doHomework().
我可以 link 这些到 doThis() 在 Task 界面。但是,Work class 没有 done() 函数,而 Homework class 有它。我将如何处理这个问题?只是没有实施?有没有更好的方法?
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...
}
使用多重继承的 adapter 实现(public 用于目标,私有用于适配器)是一种有效的方法。
只需注意函数的 return 类型:
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;
}
};
提示:不需要在派生的 class 中指定虚拟。相反,值得使用覆盖,只是为了避免在参数不匹配或 return 类型的情况下出现细微问题。
当被适配者没有可用于照顾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
}
};