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

来源:互联网 发布:我好想你网络热播视频 编辑:程序博客网 时间:2024/06/05 08:16

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

这里写图片描述

几个名词解释

这里用的都是大白话

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

处理者的实现

创建一个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);    }}
原创粉丝点击