簡體   English   中英

使用適配器設計模式

[英]Using Adapter Design Pattern

我正在努力實現適配器設計模式以利用現有的類。 我的問題是,這些類的工作原理幾乎相同,但是它們的名稱不同,而另一個的功能較少。

例如,每個Work類和Homework類都有一個執行相同功能的函數,即doWork()doHomework()
我可以將它們鏈接到Task界面中的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...
}

使用多重繼承的適配器實現(對於目標是公共的,對於適應者是私有的)是一種有效的方法。

只需注意函數的返回類型:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM