• 设计模式之二十:责任链模式(Chain of Responsibility)


    感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的。

    责任链模式:
    通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合。将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理。

    UML类图:
    这里写图片描写叙述

    主要包含:

    1. Handler:定义了一个处理请求的接口,实现了定义后继者的方法。
    2. ConcreteHandler:处理各自负责的请求,假设不能处理该请求。将请求传递给它的后继者。
    3. Client:初始化请求到一个链中的详细的Handle中。

    C++代码实现例如以下:

    #include <iostream>
    
    using namespace std;
    
    class Handler
    {
        public:
        void setSuccessor(Handler * h)
        {
            successor=h;
        }
        virtual void handleRequest(int request)=0;
        protected:
        Handler * successor;
    };
    
    class ConcreteHandler1:public Handler
    {
        public:
        void handleRequest(int request)
        {
            if(request>=0&&request<=10)
                cout<<"ConcreteHandler1 handle between 0 and 10"<<endl;
            else 
            {
                if(successor!=NULL)
                        successor->handleRequest(request);
            }
        }
    
    };
    
    class ConcreteHandler2:public Handler
    {
        public:
        void handleRequest(int request)
        {
            if(request>10&&request<=20)
                cout<<"ConcreteHandler2 handle between 10 and 20"<<endl;
            else 
            {
                if(successor!=NULL)
                        successor->handleRequest(request);
            }
        }
    
    };
    
    
    class ConcreteHandler3:public Handler
    {
        public:
        void handleRequest(int request)
        {
            if(request>20)
                cout<<"ConcreteHandler3 handle greater than 20 "<<endl;
        }
    
    };
    
    int main()
    {
        cout<<"主要的责任链模式代码"<<endl;
        Handler *h1=new ConcreteHandler1();
        Handler *h2=new ConcreteHandler2();
        Handler *h3=new ConcreteHandler3();
    
        h1->setSuccessor(h2);
        h2->setSuccessor(h3);
    
        int requests[]={1,3,11,19,20,22};
        for(int i=0;i<sizeof(requests)/sizeof(requests[0]);i++)
        {
            h1->handleRequest(requests[i]);
        }
        return 0;
    
    }
    
    

    运行输出:
    这里写图片描写叙述

  • 相关阅读:
    C#/JAVA 程序员转GO/GOLANG程序员笔记大全(DAY 04)
    C#/JAVA 程序员转GO/GOLANG程序员笔记大全(DAY 03)
    C#/JAVA 程序员转GO/GOLANG程序员笔记大全(DAY 02)
    C#/Java 程序员转GO/golang程序员笔记大全(day 01)
    selenium grid配置
    JUnit和TestNG的区别
    【转载】 HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
    selenide总结
    docker操作
    python连接oracle数据库
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7096294.html
Copyright © 2020-2023  润新知