使用适配器设计模式

感动

我正在努力实现适配器设计模式以利用现有的类。我的问题是,这些类的工作原理几乎相同,但它们的名称不同,而另一个的功能较少。

例如,每个Work类和Homework类都有一个执行相同功能的函数,即doWork()doHomework()
我可以链接到这些doThis()任务界面。但是,工作类没有做到()函数,而作业类有它。我要如何处理?只是没有执行?有没有更好的方法?

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...
}
克里斯多夫(Christophe)

使用多重继承适配器实现(对于目标是公共的,对于适应者是私有的)是一种有效的方法。

只需注意函数的返回类型即可:

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 
  }
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章