輕松掌握java責(zé)任鏈模式
定義:責(zé)任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計模式屬于行為型模式。在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。
特點:1、降低耦合度。它將請求的發(fā)送者和接收者解耦。
2、簡化了對象。使得對象不需要知道鏈的結(jié)構(gòu)。
3、增強給對象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動它們的次序,允許動態(tài)地新增或者刪除責(zé)任。
4、增加新的請求處理類很方便。
企業(yè)級開發(fā)和常用框架中的應(yīng)用:spring,struts的攔截器,servlet的過濾器
具體實例:
/**
*這里以公司請假舉例:
*1、某人請假(事件)
*2、項目組長審批:小于三天可以審批,大于三天請示上級
*3、部門主管審批:小于十天可以審批,大于十天請示上級
*4、總經(jīng)理審批 :小于30天可以審批,大于30天不批準(zhǔn)
*/
public class Demo {
public static void main(String[] args) {
Event event = new Event("程序員", 32, "回老家探親");
Leader a = new GroupLeader("張三");
Leader b = new Manager("李四");
Leader c = new GeneralManager("王五");
//指定責(zé)任鏈模式
a.setNextLeader(b);
b.setNextLeader(c);
a.handler(event);
}
}
/**
* 事件對象,責(zé)任鏈中的具體處理事件
* 該實例中即為請假這件事兒
*/
class Event{
private String name;
private int days;
private String reason;
public Event(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;
}
}
/**
* 抽象責(zé)任鏈對象,后面的所有實際責(zé)任鏈對象繼承自該對象
*/
abstract class Leader{
private String name;
protected Leader nextLeader;//責(zé)任鏈中的下一個責(zé)任對象,這是讓責(zé)任鏈持續(xù)下去的基礎(chǔ)
public Leader(String name) {
super();
this.name = name;
}
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected abstract void handler(Event event);
}
/**
* 請假流程中的第一個對象,組長
*/
class GroupLeader extends Leader{
public GroupLeader(String name) {
super(name);
}
protected void handler(Event event) {
if(event.getDays() < 3){
System.out.println("--------------------請假條--------------------");
System.out.print("| 請假人:"+event.getName()+" | ");
System.out.println("請假天數(shù):"+event.getDays()+"天"+" |");
System.out.println("| 請假原因:"+event.getReason() + " |");
System.out.println("審批人:"+this.getName()+"(組長),通過!");
System.out.println();
}else{
System.out.println(this.getName()+"(主管),沒有權(quán)限!");
this.nextLeader.handler(event);
}
}
}
/**
* 請假流程中的第二個對象,部門主管
*/
class Manager extends Leader{
public Manager(String name) {
super(name);
}
protected void handler(Event event) {
if(event.getDays() < 10){
System.out.println("--------------------請假條--------------------");
System.out.print("| 請假人:"+event.getName()+" | ");
System.out.println("請假天數(shù):"+event.getDays()+"天"+" |");
System.out.println("| 請假原因:"+event.getReason() + " |");
System.out.println("審批人:"+this.getName()+"(主管),請假通過!");
System.out.println();
}else{
System.out.println(this.getName()+"(總經(jīng)理),沒有權(quán)限!");
this.nextLeader.handler(event);
}
}
}
/**
* 請假流程中的第三個對象,總經(jīng)理
*/
class GeneralManager extends Leader{
public GeneralManager(String name) {
super(name);
}
protected void handler(Event event) {
if(event.getDays() < 30){
System.out.println("--------------------請假條--------------------");
System.out.print("| 請假人:"+event.getName()+" | ");
System.out.println("請假天數(shù):"+event.getDays()+"天"+" |");
System.out.println("| 請假原因:"+event.getReason() + " |");
System.out.println("審批人:"+this.getName()+"(總經(jīng)理)");
System.out.println();
}else{
System.out.println("--------------------請假條--------------------");
System.out.print("| 請假人:"+event.getName()+" | ");
System.out.println("請假天數(shù):"+event.getDays()+"天"+" |");
System.out.println("| 請假原因:"+event.getReason() + " |");
System.out.println("審批人:"+this.getName()+"(總經(jīng)理),請假人不通過!");
System.out.println();
}
}
}
責(zé)任鏈模式主要用于流程控制這一類的開發(fā),相比較于單純用if-else模式,在代碼修改和整合上有更高的效率,更利于代碼維護(hù)。而且,需要增加責(zé)任鏈中的對象時,需要在再實現(xiàn)一個具體的責(zé)任鏈類,然后創(chuàng)建責(zé)任對象,并維護(hù)責(zé)任鏈關(guān)系就行,不需要更大的開銷,而且在實際設(shè)計中,我們很多時候責(zé)任鏈的維護(hù)都在配置文件中進(jìn)行,這樣我們將節(jié)省更多的開發(fā)時間。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
CMD運行Intellij Idea編譯后的class文件操作
這篇文章主要介紹了CMD運行Intellij Idea編譯后的class文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
IDEA2023.3.4開啟SpringBoot項目的熱部署(圖文)
本文使用的開發(fā)工具是idea,使用的是springboot框架開發(fā)的項目,配置熱部署,可以提高開發(fā)效率,文中通過圖文介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
java中建立0-10m的消息(字符串)實現(xiàn)方法
下面小編就為大家?guī)硪黄猨ava中建立0-10m的消息(字符串)實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
詳解SpringBoot?調(diào)用外部接口的三種方式
SpringBoot不僅繼承了Spring框架原有的優(yōu)秀特性,而且還通過簡化配置來進(jìn)一步簡化了Spring應(yīng)用的整個搭建和開發(fā)過程,這篇文章主要介紹了SpringBoot?調(diào)用外部接口的三種方式,需要的朋友可以參考下2023-04-04
java并發(fā)編程專題(二)----如何創(chuàng)建并運行java線程
這篇文章主要介紹了java并發(fā)編程如何創(chuàng)建并運行java線程,文中講解非常詳細(xì),示例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
Java使用Validation自定義Double類型屬性校驗
這篇文章主要為大家詳細(xì)介紹了Java如何使用Validation自定義Double類型屬性校驗,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-11-11

