软件设计15|职责链模式
效果:
类图:
代码:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class Leader 6 { 7 protected: 8 Leader* m_manager; 9 string m_name; 10 public: 11 Leader(Leader* leader, string name) :m_manager(leader), m_name(name) {} 12 virtual void handleRequest(string name, int num) {} 13 }; 14 15 //主任 16 class Director : public Leader 17 { 18 public: 19 Director(Leader* leader, string name) :Leader(leader, name) {} 20 void handleRequest(string name, int num) 21 { 22 if (num <= 10000) 23 { 24 cout << "主任" << m_name << "审批物资" << name << "的采购单,采购金额为" << num << "元。" << endl; 25 } 26 else 27 { 28 m_manager->handleRequest(name, num); 29 } 30 } 31 }; 32 33 //部门经理 34 class Manager : public Leader 35 { 36 public: 37 Manager(Leader* leader, string name) :Leader(leader, name) {} 38 void handleRequest(string name, int num) 39 { 40 if (num <= 50000) 41 { 42 cout << "部门经理" << m_name << "审批物资" << name << "的采购单,采购金额为" << num << "元。" << endl; 43 } 44 else 45 { 46 m_manager->handleRequest(name, num); 47 } 48 } 49 }; 50 51 //副总经理 52 class ViceGeneralManager :public Leader 53 { 54 public: 55 ViceGeneralManager(Leader* leader, string name) :Leader(leader, name) {} 56 void handleRequest(string name, int num) 57 { 58 if (num <= 100000) 59 { 60 cout << "副总经理" << m_name << "审批物资" << name << "的采购单,采购金额为" << num << "元。" << endl; 61 } 62 else 63 { 64 m_manager->handleRequest(name, num); 65 } 66 } 67 }; 68 69 //总经理 70 class GeneralManager : public Leader 71 { 72 public: 73 GeneralManager(Leader* leader, string name) :Leader(leader, name) {} 74 void handleRequest(string name, int num) 75 { 76 if (num <= 200000) 77 { 78 cout << "总经理" << m_name << "审批物资" << name << "的采购单,采购金额为" << num << "元。" << endl; 79 } 80 else 81 { 82 cout << "物资" << name << "金额太大,居然为" << num << "元,需要开职工大会确认。" << endl; 83 } 84 } 85 }; 86 87 int main() 88 { 89 Leader* generalManager = new GeneralManager(NULL, "张三四"); 90 Leader* viceGeneralManager = new ViceGeneralManager(generalManager, "王五"); 91 Leader* manager = new Manager(viceGeneralManager, "李四"); 92 Leader* director = new Director(manager, "张三"); 93 94 director->handleRequest("1", 8000); 95 director->handleRequest("2", 48000); 96 director->handleRequest("3", 80000); 97 director->handleRequest("4", 190000); 98 director->handleRequest("5", 210000); 99 100 return 0; 101 }