</pre>一、今天主要学习责任链模式,责任链模式相对来说比较简单,但是今天在调试代码的时候由于不专心,一直运行不出来想要的结果,希望大家不要给我犯一样的错误。接下来我就用设计模式一个课后练习题作为实例为大家讲解。<p></p><p>二、首先了解一下责任链模式的特点,只有掌握了在什么情况下使用才能真正掌握住这个设计模式,设计模式的最高境界就是心中无设计模式,手中有设计模式,当然我还属于菜鸟级水平,在这个过程中,我将与大家一起学习设计模式,并不断将自己的学习心得分享出来。</p><p>三、责任链模式是一种链式模式,比如,一个员工需要请假,如果员工请假天数小于3天,主任可以审批该假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息, 试用职责链模式设计该假条审批模块。</p><p>四、实例的具体实现</p><p> 我们首先设计一个抽象类,让主任。代理经理,经理都继承与该类,因为他们有相同的处理方法。</p><p></p><pre name="code" class="html">package com.example.reasonbilitypattern;
public abstract class Aprove {
private Aprove msuccesor;
private int days;
public Aprove(int days) {
//super();
this.days = days;
}
public void setSuccesor(Aprove succesor) {
this.msuccesor = succesor;
}
public abstract void handle(Worker worker);
public void processor(Worker worker){
if(worker.getDays() <= days){
handle(worker);
}else{
this.msuccesor.processor(worker);
}
}
}
上面就是我们设计的抽象类,函数 setSuccesor(Aprove succesor)主要是为了传递链式结构,当主任审批不了的时候,就需要主任将该需求传递给经理 经理做经一部处理。
package com.example.reasonbilitypattern;
import android.util.Log;
public class Director extends Aprove {
public Director() {
super(3);
// TODO Auto-generated constructor stub
}
@Override
public void handle(Worker worker) {
// TODO Auto-generated method stub
System.out.println("Director"+"批准请假"+worker.getName()+worker.getReason()+worker.getDays());
Log.i("Director", worker.getName());
}
}
上述为主任的类的实现,接着是代理经理
package com.example.reasonbilitypattern;
public class ViceManager extends Aprove {
public ViceManager() {
super(10);
// TODO Auto-generated constructor stub
}
@Override
public void handle(Worker worker) {
// TODO Auto-generated method stub
System.out.println("ViceManager"+"批准请假"+worker.getName()+worker.getReason()+worker.getDays());
}
}
接着就是经理了,最大的boss
package com.example.reasonbilitypattern;
public class Manager extends Aprove {
public Manager() {
super(30);
// TODO Auto-generated constructor stub
}
@Override
public void handle(Worker worker) {
// TODO Auto-generated method stub
System.out.println("Manager"+"批准请假"+worker.getName()+worker.getReason()+worker.getDays());
}
}
上面的三个类都是继承于aprove,接下来我们来看员工的实现。
package com.example.reasonbilitypattern;
public class Worker {
private String name;
private int days;
private String reason;
public Worker(String name, int days, String reason) {
super();
this.name = name;
this.days = days;
this.reason = reason;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getDays() {
return days;
}
public void setDays(int days) {
this.days = days;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
再接着,我们来看主函数的实现
package com.example.reasonbilitypattern;
//本实例为责任链模式,是责任链模式书上一个想一想实例,为了巩固所学的责任链模式
/*
* 如果员工请假天数小于3天,主任可以审批该假条;如果员工请假天数大于等于3天,小于10天,
* 经理可以审批;如果员工请假天数大于等于10天,小于30天,
* 总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息。
* 试用职责链模式设计该假条审批模块。
* */
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
private Worker work1,work2,work3,work4;
private Aprove director,viceManager,manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWorker();
director.processor(work1);
director.processor(work2);
director.processor(work3);
System.out.println("开始了");
}
private void initWorker() {
// TODO Auto-generated method stub
work1 = new Worker("赵四", 2, "休息两天");
work2 = new Worker("李宁", 6, "我要训练");
work3 = new Worker("李三", 20, "我要旅游");
//work4 = new Worker("大牛", 30, "我要创业");
director = new Director();
viceManager = new ViceManager();
manager = new Manager();
director.setSuccesor(viceManager);
viceManager.setSuccesor(manager);
}
}
上述完成整体函数的编写,运行结果大家一猜就知道,将上述的源码复制到工程里面是直接可以运行的,希望大家多多交流,在上述代码中,文字介绍较少,由于代码简单,相信大家一下就能看。
五、总结
主要优点
职责链模式的主要优点如下:
(1) 职责链模式使得一个对象无须知道是其他哪一个对象处理其请求,对象仅需知道该请求会被处理即可,接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度。
(2) 请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有的候选处理者的引用,可简化对象的相互连接。
(3) 在给对象分派职责时,职责链可以给我们更多的灵活性,可以通过在运行时对该链进行动态的增加或修改来增加或改变处理一个请求的职责。
(4) 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可,从这一点来看是符合“开闭原则”的。
主要缺点
职责链模式的主要缺点如下:
(1) 由于一个请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;一个请求也可能因职责链没有被正确配置而得不到处理。
(2) 对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。
(3) 如果建链不当,可能会造成循环调用,将导致系统陷入死循环。