美文网首页
23种设计模式之责任链模式

23种设计模式之责任链模式

作者: 阿跳爱学习 | 来源:发表于2019-01-17 19:28 被阅读0次

优点:相比于if else,耦合度相对降低,也更灵活,。
缺点:跟if else一样,在没找到处理者之前,都要执行一遍。

例子:模拟一个公司工作的例子,如果工作难度<3,让初级职员完成,如果工作难度<5让中级职员完成,如果工作难度<10,让高级职员完成,一层层传递。

先创建一个工作实体类:

/**
 * 这是一个工作请求实体类
 * jobDetails:工作详情
 * difficult:难度等级
 */

public class Job {
    private String jobDetails;
    private int difficult;

    public Job(String jobDetails, int difficult) {
        this.jobDetails = jobDetails;
        this.difficult = difficult;
    }

    public String getJobDetails() {
        return jobDetails;
    }

    public int getDifficult() {
        return difficult;
    }
}

有工作自然就得有职员,创建一个职员抽象类,这是一个抽象处理者,设置责任链后续对象必须要有,处理请求核心业务方法必须要有,这是责任链模式核心:

/**
 * 这是一个职员抽象类
 */

public abstract class Staff {
    protected String name;
    protected Staff nextStaff;

    public Staff(String name) {
        this.name = name;
    }

    //设置责任链上的后续对象
    public void setNextStaff(Staff nextStaff) {
        this.nextStaff = nextStaff;
    }

    /**
     * @param job 处理请求核心业务方法
     */
    public abstract void handleRequest(Job job);
}

然后创建具体处理者,也就是职员类,创建三个等级的职员,初级、中级、高级,并继承职员抽象类(抽象处理者):

import android.util.Log;

/**
 * 这是一个初级职员类
 * 可完成难度3级以下工作
 */

public class JuniorStaff extends Staff {

    public JuniorStaff(String name) {
        super(name);
    }

    /**
     * 如果工作等级小于3,则由当前对象完成,否则传递给下一位具体处理者
     */
    @Override
    public void handleRequest(Job job) {
        if (job.getDifficult() < 3) {
            Log.d("TAG", "初级职员:" + name + "\n工作内容:" + job.getJobDetails() + "\n工作难度:" + job.getDifficult());
        } else {
            if (this.nextStaff != null) {
                this.nextStaff.handleRequest(job);
            }
        }
    }
}
import android.util.Log;

/**
 * 这是一个中级职员类
 * 可完成难度5级以下工作
 */

public class IntermediateStaff extends Staff {

    public IntermediateStaff(String name) {
        super(name);
    }

    /**
     * 如果工作等级小于5,则由当前对象完成,否则传递给下一位具体处理者
     */
    @Override
    public void handleRequest(Job job) {
        if (job.getDifficult() < 5) {
            Log.d("TAG", "中级职员:" + name + "\n工作内容:" + job.getJobDetails() + "\n工作难度:" + job.getDifficult());
        } else {
            if (this.nextStaff != null) {
                this.nextStaff.handleRequest(job);
            }
        }
    }
}
import android.util.Log;

/**
 * 这是一个高级职员类
 * 可完成难度10级以下工作
 */

public class SeniorStaff extends Staff {
    public SeniorStaff(String name) {
        super(name);
    }

    /**
     * 如果工作等级小于10,则由当前对象完成,否则只能呼叫大神
     */
    @Override
    public void handleRequest(Job job) {
        if (job.getDifficult() < 10) {
            Log.d("TAG", "高级职员:" + name + "\n工作内容:" + job.getJobDetails() + "\n工作难度:" + job.getDifficult());
        } else {
            Log.d("TAG", "已超出能力范围,呼叫大神!!!");
        }
    }
}

调用:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;

/**
 * 这是调用者
 */

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //创建三个等级的员工
        Staff junior = new JuniorStaff("张三");
        Staff intermediate = new IntermediateStaff("李四");
        Staff senior = new SeniorStaff("王五");

        //设置他们的责任链关系
        junior.setNextStaff(intermediate);
        intermediate.setNextStaff(senior);

        Job job = new Job("项目开发", 2);
        junior.handleRequest(job);

    }
}
结果: image.png

已完成测试!有不对的地方欢迎指出,感恩。

相关文章

网友评论

      本文标题:23种设计模式之责任链模式

      本文链接:https://www.haomeiwen.com/subject/gdpydqtx.html