【问题标题】:Using Adapter Design Pattern使用适配器设计模式
【发布时间】:2015-12-10 22:10:28
【问题描述】:

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

例如,每个 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...
}

【问题讨论】:

    标签: c++ design-patterns adapter


    【解决方案1】:

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

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

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

    【讨论】:

    • 首先,感谢您的回复。我对返回值不小心。我会编辑它。如果有很多“已完成”的事情,还值得这样做吗?
    • 有些类有一个done(),这可能更复杂:它可能需要多次连续调用才能达到完成状态。或者该状态可能是某个动态状态的条件(例如:烤箱加热超过 200°)。如果你有很多没有done() 的类,你可以考虑继承一个帮助类,或者使用模板来实现重复功能。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多