Rumah  >  Artikel  >  Java  >  Romantik Tiga Kerajaan: Model Rantaian Tanggungjawab

Romantik Tiga Kerajaan: Model Rantaian Tanggungjawab

Java后端技术全栈
Java后端技术全栈ke hadapan
2023-08-28 15:16:25943semak imbas

Salam semua, Hari ini saya akan berkongsi dengan anda 责任链模式 dalam corak reka bentuk. Gunakan kisah hidup yang sesuai dan senario projek sebenar untuk bercakap tentang corak reka bentuk, dan akhirnya meringkaskan corak reka bentuk dalam satu ayat.

Kisah

Dua hari lalu, saya membaca Romantik Tiga Kerajaan sekali lagi saya melihat bahawa Guan Yu berada di Cao Ying dan hatinya berada di Han, dan saya mendengar bahawa Liu Bei berada di Yuan. Tempat Shao Kemudian saya bermain "Melintasi Lima Laluan. Bunuh enam jeneral."

Romantik Tiga Kerajaan: Model Rantaian Tanggungjawab

Guan Yu melepasi lima hantaran dan membunuh enam jeneral Kandungan utama:

  • Hantaran pertama, Dongling Pass, membunuh jeneral pengawal Kong Xiu.

    Jeneral pengawal di Dongling Pass bernama Kong Xiu Dia pada asalnya adalah saki-baki Serban Kuning Selepas menyerah kepada Cao Cao, dia diperintahkan untuk mempertahankan Dongling Pass dengan 500 orang. Apabila rombongan Guan Yu melepasi pas, Kong Xiu meminta dokumen pelepasan kastam dan bertembung dengan Guan Yu Selepas hanya satu pusingan, dia dibunuh oleh Guan Yu.

  • Pas kedua, Pas Luoyang, Meng Tan dan Han Fu.

    Guan Yu melepasi Dongling Pass Semasa dia hendak menyeberangi Luoyang, Han Fu dan Meng Tan menghalang jalan dengan tanduk. Mula-mula, Meng Tan mencabar Guan Yu, tetapi dia bergaduh dengan Guan Yu dan kalah dalam pertarungan itu Meng Tan memusingkan kudanya dan berlari ke belakang, memikat Guan Gong untuk mengejarnya, supaya Han Fu boleh menembak anak panah dari belakang dan menangkap Guan Gong. Tetapi siapa sangka kuda arnab merah Guan Gong itu sangat laju sehingga dia dapat mengejar dari belakang, memotong Meng Tan dengan satu pukulan. Han Fu panik dan menembak anak panah, mengenai Guan Gong di lengan kirinya Guan Gong menahan luka anak panah, meluru melalui tanduk, membunuh Han Fu dengan satu pukulan, dan kemudian melintasi Luoyang.

  • Pas ketiga, Pas Bishui, Bianxi.

    Setelah mengetahui bahawa Guan Yu melepasi pas dan memenggal kepala jeneralnya, Kong Xiu dari Dongling Pass, Han Fu dari Luoyang, dan Meng Tan semuanya terbunuh, Bian Xi berfikir sendiri bahawa sukar untuk menentang Guan Gong. Jadi dia berpura-pura menyambut Guan Gong, dan mengatur supaya seorang pendekar di Kuil Zhenguo menunggu peluang untuk membunuh Guan Gong. Mujurlah, Pu Jing, abbot tua Kuil Zhenguo, memberi amaran kepadanya bahawa Guan Gong menyedari konspirasi itu, berselisih dengan Bian Xi, dan membunuh Bian Xi dengan pedang, jadi Guan Gong melepasi Pas Sishui.

  • Tahap keempat, Wang Zhi.

    Wang Zhi ini adalah saudara kepada Han Fu Dia sangat marah apabila dia mendengar bahawa Han Fu dibunuh oleh Guan Gong, jadi dia ingin membalas dendam Han Fu. Apabila Guan Gong tiba di Xingyang, Wang Zhi mengadakan jamuan di pos untuk Guan Gong dan dua isterinya. Tetapi Hu Ban yang dihantar secara rahsia untuk membakar Guan Gong. Tetapi Hu Ban melaporkan rahsia itu kepada Guan Yu kerana Guan Gong membawa surat kepada bapanya Hu Hua. Guan Yu dan dua isteri diraja dapat melarikan diri dari istana terlebih dahulu, tetapi Hu Ban berpura-pura membakar untuk mengelirukan Wang Zhi. Bagaimanapun, Wang Zhi kemudiannya mengetahui dan membunuh Hu Ban Apabila dia datang untuk mengejar Guan Yu, dia dibunuh oleh Guan Yu, jadi Guan Gong melepasi Xingyang.

  • Laluan kelima, Feri Sungai Kuning, Qin Qi.

    Qin Qi ini bukan sahaja jeneral kegemaran Xiahou Dun, tetapi juga anak saudara kepada jeneral tua Cai Yang Dia telah diperintahkan untuk menjaga feri Sungai Kuning dan memeriksa kapal yang lalu. Apabila Guan Gong tiba di feri Sungai Kuning, dia sedang mencari bot untuk menyeberangi sungai, tetapi Qin Qi menghalangnya, bukan sahaja enggan membenarkan Guan Gong dan yang lain menyeberangi sungai, tetapi mengeluarkan kata-kata sombong, yang. akhirnya menimbulkan kemarahan Guan Gong dan dipancung oleh Guan Gong

Beginilah cara Guan Yu melepasi lima pas Keseluruhan proses membunuh enam jeneral.

Jalur cerita ini mengingatkan saya kepada corak reka bentuk: Corak Rantaian Tanggungjawab.

Sebenarnya, terdapat banyak model rantaian tanggungjawab dalam kehidupan kita. Sebagai contoh: Pada asasnya setiap syarikat mempunyai sistem OA sendiri, yang terutamanya menyediakan fungsi seperti maklumat asas pekerja, permintaan cuti, masa cuti dan pembayaran balik. Jika saya perlu mengambil cuti dua hari untuk sesuatu, saya log masuk ke sistem OA dan memulakan kelulusan cuti.

Oleh kerana syarikat mempunyai peraturan berikut untuk tempoh cuti:

kurang daripada atau sama dengan setengah hari, pautan kelulusan ialah: ketua projek

lebih daripada setengah hari, kurang daripada atau sama dengan 1 hari, pautan kelulusan: ketua projek + pengarah teknikal

lebih 1 hari, proses kelulusan: ketua projek + pengarah teknikal + Boss

Dapat dilihat proses kelulusan cuti saya adalah ketua projek + pengarah teknikal + Boss.

Apakah sebenarnya corak reka bentuk rantai tanggungjawab?

Apakah model rantaian tanggungjawab?

Penjelasan bahasa Inggeris tentang model rantaian tanggungjawab ialah:

Elakkan menggandingkan penghantar permintaan kepada penerimanya dengan memberi lebih daripada satu objek peluang untuk mengendalikan permintaan. Rantai objek penerima dan hantar permintaan di sepanjang rantai sehingga anoobjek mengendalikannya.

Corak Rantaian Tanggungjawab ) merawat setiap nod dalam rantaian sebagai objek, setiap nod mengendalikan permintaan yang berbeza, dan secara automatik mengekalkan objek nod seterusnya secara dalaman. Apabila permintaan dikeluarkan dari hujung kepala rantai, ia akan dihantar kepada setiap objek nod di sepanjang laluan pratetap rantai tanggungjawab sehingga ia diproses oleh objek dalam rantai, iaitu 行为型设计模式.

Kod biasa untuk corak rantaian tanggungjawab

Java melaksanakan corak reka bentuk rantaian tanggungjawab seperti berikut:

public abstract class Handler {
        protected Handler nextHandler = null;
        public abstract void handle();
        public Handler getNextHandler() {
            return nextHandler;
        }
        public void setNextHandler(Handler nextHandler) {
            this.nextHandler = nextHandler;
        }
}

public class HandlerA extends Handler{
        @Override
        public void handle() {
            if(nextHandler == null){
                System.out.println("HandlerA handle ...");
            }else{
                nextHandler.handle();
            }
        }
}

public class HandlerB extends Handler{
        @Override
        public void handle() {
            if(nextHandler == null){
                System.out.println("HandlerB handle ...");
            }else{
                nextHandler.handle();
            }
        }
}

public class HandlerC extends Handler{
    @Override
    public void handle() {
        if(getNextHandler() == null){
            System.out.println("HandlerC handle ...");
        }else{
            getNextHandler().handle();
        }
    }
}
//测试
public class  Client{
    public static void main(String[] args) {
        Handler handlerA = new HandlerA();
        Handler handlerB = new HandlerB();
        handlerA.setNextHandler(handlerB);
        handlerA.handle();
    }
}

Hasil berjalan:

HandlerC handle ...

Daripada kod di atas, kita boleh melukis gambar rajah UML:

Romantik Tiga Kerajaan: Model Rantaian Tanggungjawab


Daripada rajah UML , kita dapat melihat bahawa terdapat dua peranan yang sangat penting dalam model rantaian tanggungjawab:

(1), peranan pengendali abstrak (Pengendali)

mentakrifkan antara muka untuk memproses permintaan. Antara muka juga boleh menyediakan kaedah untuk menetapkan dan mengembalikan rujukan kepada objek seterusnya. Peranan ini biasanya dilaksanakan oleh kelas abstrak Java atau antara muka Java.

(2), peranan pengendali khusus (HandlerA, HandlerB, HandlerC)

🎜Selepas menerima permintaan, pengendali khusus boleh memilih untuk memproses permintaan atau menghantar permintaan kepada objek seterusnya. Oleh kerana pengendali khusus memegang rujukan kepada rumah seterusnya. 🎜

责任链模式的优缺点

  • 优点:请求和处理分开,两者解耦,提供系统的灵活性。
  • 缺点:性能能问,一个链非常长的时候,非常耗时。因为我们避免建立很长的链。

生活中的案例

在日常生活中,责任链模式是比较常见的。我们平时处理工作中的一些事务,往往是各部门协同合作来完成某一个任务的。而每个部门都有各自的职责,因此,很多时候事情完成一半,便会转交到下一个部门,直到所有部门都审批通过,事情才能完成。

责任链模式主要解耦了请求与处理,客户只需将请求发送到链上即可,不需要关心请求的具体内容和处理细节,请求会自动进行传递,直至有节点对象进行处理。

责任链模式主要适用于以下应用场景:

  • 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交请求。
  • 可动态指定一组对象处理请求。

请假流程的代码实现

下面我们来对,前面的案例:OA上请假流程做一个Java代码的实现。

抽象处理者:领导类

public abstract class Leader {
    private Leader next;
    public void setNext(Leader next) {
        this.next = next;
    }
    public Leader getNext() {
        return next;
    }
    //处理请求的方法
    public abstract void handleRequest(double LeaveDays);
}

项目负责人

public class ProjectLeader extends Leader {
    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays <= 0.5) {
            System.out.println("项目负责人批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}

技术总监

public class TechnicalDirectorLeader extends Leader {

    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays <= 1) {
            System.out.println("技术总监批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}

Boss

public class BossLeader extends Leader {
    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays >= 2 && LeaveDays <= 30) {
            System.out.println("Boss批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}

发起审批

public class LeaveApproval {
    public static void main(String[] args) {
        //组装责任链
        Leader projectLeader = new ProjectLeader();
        Leader technicalDirectorLeader = new TechnicalDirectorLeader();
        Leader bossLeader = new BossLeader();

        projectLeader.setNext(technicalDirectorLeader);
        technicalDirectorLeader.setNext(bossLeader);

        //请假两天,提交请假流程,开启审批环节,
        projectLeader.handleRequest(2);
    }
}

审批结果

Boss批准您请假2.0天。

如果请假天数是31天,审批结果

请假天数太多,没有人批准该假条!

整个请假流程为:

.

Tidak berguna untuk menyombongkan diri. Mari kita lihat bagaimana tuan menggunakan model rantaian tanggungjawab. Romantik Tiga Kerajaan: Model Rantaian Tanggungjawab

Cara orang besar menggunakannya

Dalam rangka kerja seperti Spring dan Mybatis, model rantaian tanggungjawab digunakan dalam Spring.

Dalam kelas Romantik Tiga Kerajaan: Model Rantaian Tanggungjawab dalam Spring MVC:



getHandler 方法的处理使用到了责任链模式,handlerMappings是之前 Spring 容器初始化好的,通过遍历 handlerMappings查找与request匹配的 Handler, 这里返回 HandlerExecutionChain 对象。这个 HandlerExecutionChain对象到后面执行的时候再分析为什么返回的是这样一个对象。

@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
 if (this.handlerMappings != null) {
  for (HandlerMapping mapping : this.handlerMappings) {
   HandlerExecutionChain handler = mapping.getHandler(request);
   if (handler != null) {
    return handler;
   }
  }
 }
 return null;
}

以上便是责任链模式在Spring的具体使用

总结

本文通过关二爷的过五关斩六将和OA系统中的请假审批流程,完美的解释了责任链设计模式。

Atas ialah kandungan terperinci Romantik Tiga Kerajaan: Model Rantaian Tanggungjawab. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Java后端技术全栈. Jika ada pelanggaran, sila hubungi admin@php.cn Padam