欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

輕松掌握java責任鏈模式

 更新時間:2016年09月29日 15:39:32   作者:斷了聯(lián)系  
這篇文章主要幫助大家輕松掌握java責任鏈模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

定義:責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進行解耦。這種類型的設(shè)計模式屬于行為型模式。在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。

特點:1、降低耦合度。它將請求的發(fā)送者和接收者解耦。

             2、簡化了對象。使得對象不需要知道鏈的結(jié)構(gòu)。

             3、增強給對象指派職責的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動它們的次序,允許動態(tài)地新增或者刪除責任。

             4、增加新的請求處理類很方便。

企業(yè)級開發(fā)和常用框架中的應(yīng)用:spring,struts的攔截器,servlet的過濾器

具體實例:

/**
 *這里以公司請假舉例:
 *1、某人請假(事件)
 *2、項目組長審批:小于三天可以審批,大于三天請示上級
 *3、部門主管審批:小于十天可以審批,大于十天請示上級
 *4、總經(jīng)理審批 :小于30天可以審批,大于30天不批準
 */
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("王五");
 
 //指定責任鏈模式
 a.setNextLeader(b);
 b.setNextLeader(c);
 
 a.handler(event);
 }
}

/**
 * 事件對象,責任鏈中的具體處理事件
 * 該實例中即為請假這件事兒
 */
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;
 }
}

/**
 * 抽象責任鏈對象,后面的所有實際責任鏈對象繼承自該對象 
 */
abstract class Leader{
 private String name;
 protected Leader nextLeader;//責任鏈中的下一個責任對象,這是讓責任鏈持續(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();
 }
 }
}

責任鏈模式主要用于流程控制這一類的開發(fā),相比較于單純用if-else模式,在代碼修改和整合上有更高的效率,更利于代碼維護。而且,需要增加責任鏈中的對象時,需要在再實現(xiàn)一個具體的責任鏈類,然后創(chuàng)建責任對象,并維護責任鏈關(guān)系就行,不需要更大的開銷,而且在實際設(shè)計中,我們很多時候責任鏈的維護都在配置文件中進行,這樣我們將節(jié)省更多的開發(fā)時間。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實現(xiàn)列表、集合與數(shù)組之間轉(zhuǎn)化的方法

    java實現(xiàn)列表、集合與數(shù)組之間轉(zhuǎn)化的方法

    這篇文章主要介紹了java實現(xiàn)列表、集合與數(shù)組之間轉(zhuǎn)化的方法,涉及java中列表、集合與數(shù)組相互轉(zhuǎn)換的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • spring中@Autowire和@Resource的區(qū)別在哪里(推薦)

    spring中@Autowire和@Resource的區(qū)別在哪里(推薦)

    這篇文章主要介紹了spring中@Autowire和@Resource的區(qū)別在哪里?本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • Java基于堆結(jié)構(gòu)實現(xiàn)優(yōu)先隊列功能示例

    Java基于堆結(jié)構(gòu)實現(xiàn)優(yōu)先隊列功能示例

    這篇文章主要介紹了Java基于堆結(jié)構(gòu)實現(xiàn)優(yōu)先隊列功能,結(jié)合實例形式分析了java優(yōu)先隊列的簡單定義與使用方法,需要的朋友可以參考下
    2017-11-11
  • SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式

    SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式

    這篇文章主要介紹了SpringBoot配置文件中系統(tǒng)環(huán)境變量存在特殊字符的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • IDEA社區(qū)版創(chuàng)建spring boot項目的安裝插件的圖文教程

    IDEA社區(qū)版創(chuàng)建spring boot項目的安裝插件的圖文教程

    這篇文章主要介紹了IDEA社區(qū)版創(chuàng)建spring boot項目的安裝插件,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java和C++通過new創(chuàng)建的對象有何區(qū)別?

    Java和C++通過new創(chuàng)建的對象有何區(qū)別?

    Java和C++都是面向?qū)ο蟮木幊陶Z言,然而Java和C++在創(chuàng)建對象時卻存在不同的方式,由于方式的不同導致在內(nèi)存中管理的不同。這篇文章主要給大家介紹了關(guān)于Java和C++通過new創(chuàng)建對象區(qū)別的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • Java 輕松入門了解File類的使用

    Java 輕松入門了解File類的使用

    Java文件類以抽象的方式代表文件名和目錄路徑名。該類主要用于文件和目錄的創(chuàng)建、文件的查找和文件的刪除等。File對象代表磁盤中實際存在的文件和目錄。通過以下構(gòu)造方法創(chuàng)建一個File對象
    2022-03-03
  • Spring Boot與Spring Security的跨域問題解決方案

    Spring Boot與Spring Security的跨域問題解決方案

    跨域問題是指在Web開發(fā)中,瀏覽器出于安全考慮,限制了不同域名之間的資源訪問,本文重點給大家介紹Spring Boot與Spring Security的跨域問題解決方案,感興趣的朋友一起看看吧
    2023-09-09
  • 詳解springMVC容器加載源碼分析

    詳解springMVC容器加載源碼分析

    這篇文章主要介紹了詳解springMVC容器加載源碼分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • MyBatis復(fù)雜Sql查詢實現(xiàn)示例介紹

    MyBatis復(fù)雜Sql查詢實現(xiàn)示例介紹

    在利用mybatis做查詢的時候,一般返回結(jié)果用resulttype,這種情況必須是查詢的結(jié)果在對應(yīng) 的pojo類中有對應(yīng)的,一般都是單表查詢,但是對于一些復(fù)雜的情況,比如需要用到多表查詢的時候,resultType不再適用,此時一般用resultMap來表示返回的結(jié)果
    2022-12-12

最新評論