27
2017
09

设计模式之----责任链模式

闲来无事,回顾一下设计模式,顺手记录下。
责任链模式:多个处理者都有可能处理事件,从而避免发送者和接收者之间的耦合关系。将这些处理者形成一条链,沿着这条链,传递事件的请求,直到处理者将该事件处理为止。

这里写图片描述

几个名词解释

这里用的都是大白话

  • 处理者:能够消费事件的对象
  • 链:当前处理者对象有下一个处理者对象的引用,能够进行事件传递
  • 发送者:将处理者组织成链条,并将事件传递给接收者(第一个处理者)

处理者的实现

创建一个Handler抽象类,持有下一个处理者的引用,同时,定义接收事件的方法,抽象:处理事件、条件判断的方法,让子类去处理。

public abstract class Handler {

    private static final String TAG = Handler.class.getSimpleName();
    public Handler nextHandler;

    //处理事件,子类去实现
    public abstract void handle(Context context, Event event);
    //当前处理者能处理的条件
    public abstract int handleLevel();

    //处理者处理事件的统一入口
    public void handleEvent(Context context, Event event){
        if (event != null){
            if (event.getEventLevel() == this.handleLevel()){
                //处理事件
                handle(context, event);
            }else{
                if (nextHandler != null){
                    // 让下一个事件处理者处理事件
                    nextHandler.handleEvent(context, event);
                }else{
                    Log.e(TAG,"没有处理者能够处理该事件");
                }
            }
        }
    }
}

实现具体的处理者:

public class Handler1 extends Handler {
    private static final String TAG = Handler1.class.getSimpleName();

    @Override
    public void handle(Context context, Event event) {
        Toast.makeText(context,TAG+"处理了当前事件", Toast.LENGTH_LONG).show();
        Log.e(TAG, TAG+"处理了当前事件");
    }

    @Override
    public int handleLevel() {
        return 1;
    }
}

请求的实现

事件请求,抽象一个事件被处理的条件,让实现者去返回当前事情被处理的条件。

public abstract class Event {
    /** * 返回当前对象 * @return */
    public Event getEvent(){
        return this;
    }
    //返回事件对应的级别,在处理者中使用
    public abstract int getEventLevel();
}

实现事件对象:

public class Event1 extends Event {
    @Override
    public int getEventLevel() {
        return 1;
    }
}

发送者的实现

本例是安卓demo,在Activity中实现。将处理者拼装成链子,生成事件,将事件传递给链条头。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View v){
// Toast.makeText(this,"点击了按钮",Toast.LENGTH_LONG).show();
        //产生一个事件
        Event3 event3 = new Event3();

        Handler1 handler1 = new Handler1();
        Handler2 handler2 = new Handler2();
        Handler3 handler3 = new Handler3();

        //将处理者拼装成链
        handler1.nextHandler = handler2;
        handler2.nextHandler = handler3;
        // 处理者1调用事件处理的入口方法
        handler1.handleEvent(this,event3);
    }
}
上一篇:《图解HTTP[上野宣]》读书笔记六-6 下一篇:关于最近没有更新博文的原因及一些其他问题统一回复