設計模式(十三) 職責鏈(chain of responsibility)

軟件領域中的設計模式爲開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向對象編程語言的重要特性:封裝、繼承、多態,真正領悟設計模式的精髓是可能一個漫長的過程,須要大量實踐經驗的積累。最近看設計模式的書,對於每一個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可複用面向對象軟件的基礎》兩本書。本文介紹裝飾模式的實現。編程

       職責鏈模式:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。其思想很簡單,考慮員工要求加薪。公司的管理者一共有三級,總經理、總監、經理,若是一個員工要求加薪,應該向主管的經理申請,若是加薪的數量在經理的職權內,那麼經理能夠直接批准,不然將申請上交給總監。總監的處理方式也同樣,總經理能夠處理全部請求。這就是典型的職責鏈模式,請求的處理造成了一條鏈,直到有一個對象處理請求。設計模式

//抽象管理者  
class Manager  
{  
protected:  
    Manager *m_manager;  
    string m_name;  
public:  
    Manager(Manager *manager, string name):m_manager(manager), m_name(name){}  
    virtual void DealWithRequest(string name, int num)  {}  
};  
//經理  
class CommonManager: public Manager  
{  
public:  
    CommonManager(Manager *manager, string name):Manager(manager,name) {}  
    void DealWithRequest(string name, int num)   
    {  
        if(num < 500) //經理職權以內  
        {  
            cout<<"經理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;  
        }  
        else  
        {  
            cout<<"經理"<<m_name<<"沒法處理,交由總監處理"<<endl;  
            m_manager->DealWithRequest(name, num);  
        }  
    }  
};  
//總監  
class Majordomo: public Manager  
{  
public:  
    Majordomo(Manager *manager, string name):Manager(manager,name) {}  
    void DealWithRequest(string name, int num)   
    {  
        if(num < 1000) //總監職權以內  
        {  
            cout<<"總監"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;  
        }  
        else  
        {  
            cout<<"總監"<<m_name<<"沒法處理,交由總經理處理"<<endl;  
            m_manager->DealWithRequest(name, num);  
        }  
    }  
};  
//總經理  
class GeneralManager: public Manager  
{  
public:  
    GeneralManager(Manager *manager, string name):Manager(manager,name) {}  
    void DealWithRequest(string name, int num)  //總經理能夠處理全部請求  
    {  
        cout<<"總經理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;  
    }  
};  

  

//測試案例  
int main()  
{     
    Manager *general = new GeneralManager(NULL, "A"); //設置上級,總經理沒有上級  
    Manager *majordomo = new Majordomo(general, "B"); //設置上級  
    Manager *common = new CommonManager(majordomo, "C"); //設置上級  
    common->DealWithRequest("D",300);   //員工D要求加薪  
    common->DealWithRequest("E", 600);  
    common->DealWithRequest("F", 1000);  
    delete common; delete majordomo; delete general;  
    return 0;  
}  
相關文章
相關標籤/搜索