责任链模式

责任链模式:是多个对象都有机会处理请求,从而避免请求的发送者和接受者
之间发生耦合,此模式形成一条链,并延着这条链的传递请求,直到有一个对象能够处理它为止

责任链主要思想是,对象引用了同一类型的另一个对象,形成一条链。链中的每个对象实现了同样的
方法,处理链中第一个对象发起一个请求,如果对象不知道如何处理请求,就把他传递下一个响应
者。
 
UIView响应者链就是一个完美的责任链模式具体应用:


#import <Foundation/Foundation.h>
#import <set>
#import <iostream>
using namespace::std;

typedef enum : NSUInteger {
    kUIWindowEvent,
    kUIScrollerViewEvent,
    kTableViewEvent,
    kLabelViewEvent,
}KEvent;

class IUIView{
protected:
    std::string _name;
    KEvent      _event;
public:
    IUIView*    _nextHanlder;
public:
    virtual ~IUIView() {};
public:
    virtual void handler(KEvent event) = 0;
    virtual void addSubView(IUIView* view) = 0;
};

class UIView:public IUIView{

public:
    void handler(KEvent event){
        std::cout <<" 我是UIView基类,任何事件我都能处理" <<std::endl;
    };
    void addSubView(IUIView* view){
        if (!view) {
            return;
        }
        view -> _nextHanlder = this;
    }
    
    void nextHanlder(KEvent event){
        if (_nextHanlder) {
            _nextHanlder -> handler(event);
        }else{
            handler(event);
        }
    }
};

class UIWindow:public UIView{
public:
    void handler(KEvent event){
        if (event == kUIWindowEvent) {
            std::cout <<"我是窗口,我处理了这个事件" <<std::endl;
        }else{
            nextHanlder(event);
        }
    }
};

class UIScrollerView:public UIView{
public:
    void handler(KEvent event){
       if (event == kUIScrollerViewEvent) {
            std::cout <<"我是滚动视图,我处理了这个事件" <<std::endl;
        }else{
            nextHanlder(event);
        }
    }
};

class UILabel:public UIView{
public:
    void handler(KEvent event){
       if (event == kLabelViewEvent) {
            std::cout <<"我是标签,我处理了这个事件" <<std::endl;
        }else{
            nextHanlder(event);
        }
    }
};

class UITableView:public UIScrollerView{
public:
    void handler(KEvent event){
       if (event == kTableViewEvent) {
            std::cout <<"我是表格视图,我处理了这个事件" <<std::endl;
        }else{
            nextHanlder(event);
        }
    }
};

//合成部件视图,具备添加子视图的能力
int main(int argc, const char * argv[]) {
    @autoreleasepool {
    
        IUIView* window = new UIWindow();
        IUIView* scrollView = new UIScrollerView();
        window -> addSubView(scrollView);
        IUIView* tableView = new UITableView();
        scrollView -> addSubView(tableView);
        IUIView* label = new UILabel();
        tableView -> addSubView(label);

        //1、kUIWindowEvent,产生窗口事件
        label -> handler(kUIWindowEvent);
        //2、kUIScrollerViewEvent,产生滚动事件
        label -> handler(kUIScrollerViewEvent);
        //3、kTableViewEvent,产生表格事件
        label -> handler(kTableViewEvent);
        //4、kLabelViewEvent,产生标签事件
        label -> handler(kLabelViewEvent);

    }
    return 0;
}

/**

 */

输出:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值