2010年8月7日 星期六

天使與魔鬼物件

#include <iostream>
#include <string>
#include <sstream>
#include <map>
using namespace std;

class Device {
public:
  Device(void): item_number(0) {}
  virtual void doAddItem(string parameter) {
    istringstream iss(parameter);
    int num = 0;
    iss >> num;
    item_number += num;
  }
  virtual void doDelItem(string parameter) {
    istringstream iss(parameter);
    int num = 0;
    iss >> num;
    item_number -= num;
  }
  virtual void doShowItem(string parameter) {
    cout << item_number << endl;
  }
  virtual void execute(string command, string parameter) = 0;
protected:
  int item_number;
};

class AngelDevice;
class DemonDevice;
template <typename T>
class Commander {
public:
  void addInvocation(string command, void (T::*fptr)(string)) {
    cmdMap[command] = fptr;
  }
  void (T::*getInvocation(string command))(string) {
    return cmdMap[command];
  }
protected:
  map < string, void (T:: *)(string) > cmdMap;
};

class AngelDevice : public Device {
  typedef void (AngelDevice::*APTR)(string);
public:
  AngelDevice(void) {
    commander.addInvocation("add", &AngelDevice::doAddItem);
    commander.addInvocation("del", &AngelDevice::doDelItem);
    commander.addInvocation("twice", &AngelDevice::doTwiceItem);
    commander.addInvocation("show", &AngelDevice::doShowItem);
  }
  virtual ~AngelDevice() {}
  virtual void doAddItem(string parameter) {
    istringstream iss(parameter);
    int num = 0;
    iss >> num;
    item_number += num * 2;
  }
  virtual void doDelItem(string parameter) {
    istringstream iss(parameter);
    int num = 0;
    iss >> num;
    item_number -= num / 2;
  }
  virtual void doTwiceItem(string parameter) {
    item_number *= 2;
  }
  virtual void execute(string command, string parameter) {
    APTR ptr = commander.getInvocation(command);
    if(ptr) {
      (this->*ptr)(parameter);
    }
  }
protected:
  Commander<AngelDevice> commander;
};

class DemonDevice : public Device {
  typedef void (DemonDevice::*DPTR)(string);
public:
  DemonDevice() {
    commander.addInvocation("add", &DemonDevice::doAddItem);
    commander.addInvocation("del", &DemonDevice::doDelItem);
    commander.addInvocation("half", &DemonDevice::doHalfItem);
    commander.addInvocation("show", &DemonDevice::doShowItem);
  }
  virtual ~DemonDevice() {}
  virtual void doAddItem(string parameter) {
    istringstream iss(parameter);
    int num = 0;
    iss >> num;
    item_number += num / 2;
  }
  virtual void doDelItem(string parameter) {
    istringstream iss(parameter);
    int num = 0;
    iss >> num;
    item_number -= num * 2;
  }
  virtual void doHalfItem(string parameter) {
    item_number /= 2;
  }
  virtual void execute(string command, string parameter) {
    DPTR ptr = commander.getInvocation(command);
    if(ptr) {
      (this->*ptr)(parameter);
    }
  }
protected:
  Commander<DemonDevice> commander;
};

int main(int argc, char *argv[]) {
  string command, parameter;
  AngelDevice device;
  for(; true;) {
    cin >> command >> parameter;
    device.execute(command, parameter);
  }
  system("pause");
  return EXIT_SUCCESS;
}

沒有留言:

張貼留言