闲来无事,回顾一下设计模式,顺手记录下。
责任链模式:多个处理者都有可能处理事件,从而避免发送者和接收者之间的耦合关系。将这些处理者形成一条链,沿着这条链,传递事件的请求,直到处理者将该事件处理为止。
几个名词解释
这里用的都是大白话
- 处理者:能够消费事件的对象
- 链:当前处理者对象有下一个处理者对象的引用,能够进行事件传递
- 发送者:将处理者组织成链条,并将事件传递给接收者(第一个处理者)
处理者的实现
创建一个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);
}
}