真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

No2.大話設(shè)計(jì)模式學(xué)習(xí)之橋聯(lián)、職責(zé)鏈、中介模式-創(chuàng)新互聯(lián)

2.設(shè)計(jì)模式-part5
  • 2.10 橋接模式
    • 描述:橋接模式是將抽象部分與其實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化
    • 好處1:可以避免創(chuàng)建者和具體產(chǎn)品之間的緊密耦合;
    • 好處2:避免了繼承導(dǎo)致的類爆炸問題。
    • 好處3:具備靈活的可擴(kuò)展性
    • 壞處1:將抽象和實(shí)現(xiàn)分離會(huì)增加設(shè)計(jì)的難度
    • eg:對(duì)于不同品牌的手機(jī),軟件基本無法兼容。因此如果手機(jī)需要增加軟件,就需要針對(duì)不同品牌的手機(jī)分別實(shí)現(xiàn)軟件功能
      • 場(chǎng)景:實(shí)現(xiàn)該問題的程序通常會(huì)采用繼承方式設(shè)計(jì),那么父類和子類之間會(huì)具有非常緊密的依賴關(guān)系,父類中的任何變化都會(huì)影響子類,子類繼承的實(shí)現(xiàn)如果無法解決新需求就必須重寫或替換父類。如此設(shè)計(jì)會(huì)導(dǎo)致類爆炸問題,并且擴(kuò)展不靈活
      • 其它適用場(chǎng)景:
        • 對(duì)于使用較多類繼承問題而導(dǎo)致緊耦合、擴(kuò)展性差的系統(tǒng)。
        • 對(duì)于存在多個(gè)獨(dú)立變化并需要靈活擴(kuò)展維度的需求
      • 應(yīng)用:
        • JDBC 規(guī)范和不同數(shù)據(jù)庫廠商驅(qū)動(dòng)的實(shí)現(xiàn)。
        • Spring 中可以根據(jù)客戶的需求能夠動(dòng)態(tài)切換不同的數(shù)據(jù)源。
        • Nginx 的模塊架構(gòu)就應(yīng)用了橋接模式,使用了nginx_module_t定義模塊,結(jié)構(gòu)體里有若干函數(shù)指針和擴(kuò)展字段,然后橋接實(shí)現(xiàn)了豐富多彩的 core、conf、event、stream、http 等功能模塊,搭建起整個(gè) Nginx 框架
      • 步驟:
      • 核心思想使用合成/聚合原則代替類繼承思想設(shè)計(jì)程序,從而降低耦合度、減少代碼量。
        首先確定分類的角度,然后把這些實(shí)現(xiàn)獨(dú)立出來,讓它們互不干擾相互獨(dú)立,從而減少耦合。需要注意的是能否找到合適的橋接點(diǎn),如果沒有就不必要非要使用橋接模式。
        包括以下四個(gè)角色:
        • Abstraction(抽象類):用于定義抽象類的接口,其中定義了一個(gè)具有關(guān)聯(lián)關(guān)系的Implementor 的對(duì)象。
        • RefinedAbstraction(擴(kuò)充抽象類):繼承并實(shí)現(xiàn)抽象類中的接口,并在其中調(diào)用Implementor 對(duì)象的相關(guān)業(yè)務(wù)方法。
        • Implementor(實(shí)現(xiàn)類):用于定義實(shí)現(xiàn)類的接口,提供基本的業(yè)務(wù)方法供抽象類調(diào)用,以完成復(fù)雜的操作。
        • ConcreteImplementor(具體實(shí)現(xiàn)類):繼承并實(shí)現(xiàn) Implementor 的接口,在不同的具體實(shí)現(xiàn)類中提供不同的操作方法,通過向上轉(zhuǎn)型的方式完成方法的調(diào)用。
      • 注意事項(xiàng):
        • 將狀態(tài)的轉(zhuǎn)換放到具體的狀態(tài)類內(nèi)部
        • 通過上下文直接或通過參數(shù)改變狀態(tài),而不同的狀態(tài)對(duì)應(yīng)不同的行為
      • 代碼實(shí)現(xiàn):
        • HandsetSoft實(shí)現(xiàn)類:
        • public abstract class HandsetSoft {
              public abstract void run();
          }
        • HandsetSoft具體實(shí)現(xiàn)類:
        • public class HandsetGame extends HandsetSoft {
              @Override
              public void run() {
                  System.out.println("運(yùn)行手機(jī)游戲");
              }
          }
          
          public class HandsetAddressList extends HandsetSoft {
              @Override
              public void run() {
                  System.out.println("運(yùn)行手機(jī)通訊錄");
              }
          }
        • HandsetBrand抽象類:
        • public abstract class HandsetBrand {
              protected HandsetSoft soft;
          
              public void SetHandsetSoft(HandsetSoft soft) {
                  this.soft = soft;
              }
          
              public abstract void run();
          }
        • HandsetBrand擴(kuò)展抽象類:
        • public class HandsetBrandM extends HandsetBrand {
              @Override
              public void run() {
                  soft.run();
              }
          }
          
          public class HandsetBrandN extends HandsetBrand {
              @Override
              public void run() {
                  soft.run();
              }
          }
        • 調(diào)用方
        • public class Main {
              public static void main(String[] args) {
                  HandsetBrand ab;
                  ab = new HandsetBrandN();
          
                  ab.SetHandsetSoft(new HandsetGame());
                  ab.run();
          
                  ab.SetHandsetSoft(new HandsetAddressList());
                  ab.run();
          
                  ab = new HandsetBrandM();
          
                  ab.SetHandsetSoft(new HandsetGame());
                  ab.run();
          
                  ab.SetHandsetSoft(new HandsetAddressList());
                  ab.run();
              }
          }
      • 橋接模式通用結(jié)構(gòu)示意圖如下(引申)
        • image-20221017164911912
  • 2.11 職責(zé)鏈模式 collapsed:: true
    • 描述:職責(zé)鏈模式核心是解決服務(wù)中先后執(zhí)行處理關(guān)系,從而降低請(qǐng)求發(fā)送者和接受者之間的耦合關(guān)系。類似于擊鼓傳花
    • 好處1:能夠簡化對(duì)象的相互連接,接收者和發(fā)送者都沒有對(duì)方的明確信息,且鏈中的對(duì)象也不知道鏈的結(jié)構(gòu)。
    • 好處1:避免了請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。
    • 好處3:能夠隨時(shí)修改請(qǐng)求的結(jié)構(gòu),增強(qiáng)了給對(duì)象指派職責(zé)的靈活性
    • 壞處1:請(qǐng)求可能到了鏈的末端都得不到處理,或者因?yàn)闆]有正確配置得不到處理。
    • 壞處2:較長的責(zé)任鏈可能會(huì)影響到系統(tǒng)的性能
    • eg:
      • Netty 中 Pipeline 與 ChannelHandler 通過責(zé)任鏈來組織代碼邏輯。
      • Tomcat 中 Servlet 過濾器使用了責(zé)任鏈模式。
      • Spring 中切面編程和安全機(jī)制都使用了責(zé)任鏈模式。
      • 一個(gè)請(qǐng)求有多個(gè)對(duì)象可以處理,但每個(gè)對(duì)象的處理?xiàng)l件或權(quán)限不同
    • 場(chǎng)景:加薪、請(qǐng)假申請(qǐng)等需要層層審批的場(chǎng)景。比如向經(jīng)理提加薪申請(qǐng),經(jīng)理沒權(quán)利然后向總監(jiān)上報(bào),總監(jiān)沒權(quán)限然后向總經(jīng)理匯報(bào)等
    • 步驟:
      • 將公司管理者的類別變成管理者的子類,可以通過多態(tài)性來化解分支帶來的僵化。然后通過不同管理者之間建立管理關(guān)系實(shí)現(xiàn)請(qǐng)求的傳遞,使得請(qǐng)求的發(fā)送者和接收者解耦,可以讓各服務(wù)模塊更加清晰。處理者負(fù)責(zé)處理請(qǐng)求,客戶只需要將請(qǐng)求發(fā)送到職責(zé)鏈,無需關(guān)心具體的處理細(xì)節(jié)。
      • Handler(請(qǐng)求類):用于定義一個(gè)處理請(qǐng)示的接口。
      • ConcreteHandler(具體處理者類):處理它所負(fù)責(zé)的請(qǐng)求,可訪問它的后繼者,如果能夠處理就處理,否則就將請(qǐng)求轉(zhuǎn)發(fā)給它的后繼者
    • 代碼實(shí)現(xiàn):
      • Request類:
      • public class Request {
            private String requestType;
            private String requestContent;
            private int number;
        
            public String getRequestType() {
                return requestType;
            }
        
            public void setRequestType(String requestType) {
                this.requestType = requestType;
            }
        
            public String getRequestContent() {
                return requestContent;
            }
        
            public void setRequestContent(String requestContent) {
                this.requestContent = requestContent;
            }
        
            public int getNumber() {
                return number;
            }
        
            public void setNumber(int number) {
                this.number = number;
            }
        }
      • Manager類:
      • public abstract class Manager {
            protected String name;
            protected Manager superior;
        
            protected Manager(String name) {
                this.name = name;
            }
        
            public void SetSuperior(Manager superior) {
                this.superior = superior;
            }
        
            public abstract void requestApplications(Request request);
        }
      • ConcreteManager類:
      • public class GeneralManager extends Manager {
            protected GeneralManager(String name) {
                super(name);
            }
        
            @Override
            public void requestApplications(Request request) {
                if(request.getRequestType() == "請(qǐng)假"){
                    System.out.println(name + ":" + request.getRequestContent() + " 數(shù)量" + request.getNumber() + " 被批準(zhǔn)" );
                }else if(request.getRequestType() == "加薪" && request.getNumber()<= 500) {
                    System.out.println(name + ":" + request.getRequestContent() + " 數(shù)量" + request.getNumber() + " 被批準(zhǔn)" );
                }else {
                    System.out.println(name + ":" + request.getRequestContent() + " 數(shù)量" + request.getNumber() + " 再說吧" );
                }
            }
        }
        
        public class MajorDemo extends Manager {
            protected MajorDemo(String name) {
                super(name);
            }
        
            @Override
            public void requestApplications(Request request) {
                if(request.getRequestType() == "請(qǐng)假" && request.getNumber()<= 5) {
                    System.out.println(name + ":" + request.getRequestContent() + " 數(shù)量" + request.getNumber() + " 被批準(zhǔn)" );
                }else {
                    if(superior != null) {
                        superior.requestApplications(request);
                    }
                }
            }
        }
        
        public class MajorDemo extends Manager {
            protected MajorDemo(String name) {
                super(name);
            }
        
            @Override
            public void requestApplications(Request request) {
                if(request.getRequestType() == "請(qǐng)假" && request.getNumber()<= 5) {
                    System.out.println(name + ":" + request.getRequestContent() + " 數(shù)量" + request.getNumber() + " 被批準(zhǔn)" );
                }else {
                    if(superior != null) {
                        superior.requestApplications(request);
                    }
                }
            }
        }
      • 調(diào)用方
      • public class Main {
            public static void main(String[] args) {
                CommonManager jinli = new CommonManager("金利");
                MajorDemo zongjian = new MajorDemo("宗劍");
                GeneralManager zhongjingli = new GeneralManager("鐘精勵(lì)");
                jinli.SetSuperior(zongjian);
                zongjian.SetSuperior(zhongjingli);
        
                Request request = new Request();
                request.setRequestType("請(qǐng)假");
                request.setRequestContent("小菜請(qǐng)假");
                request.setNumber(1);
                jinli.requestApplications(request);
        
                Request request2 = new Request();
                request2.setRequestType("請(qǐng)假");
                request2.setRequestContent("小菜請(qǐng)假");
                request2.setNumber(4);
                jinli.requestApplications(request2);
        
                Request request3 = new Request();
                request3.setRequestType("加薪");
                request3.setRequestContent("小菜請(qǐng)求加薪");
                request3.setNumber(500);
                jinli.requestApplications(request3);
        
                Request request4 = new Request();
                request4.setRequestType("加薪");
                request4.setRequestContent("小菜請(qǐng)求加薪");
                request4.setNumber(1000);
                jinli.requestApplications(request4);
            }
        }
      • 職責(zé)鏈模式通用結(jié)構(gòu)示意圖如下(引申)
        • image-20221017164911912
  • 2.12 中介模式
    • 描述:用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們的交互
    • 好處1:中介者減少了各個(gè)業(yè)務(wù)類的耦合,使得可以獨(dú)立的改變和復(fù)用各個(gè)業(yè)務(wù)類和中介者類。
    • 好處2:中介者的實(shí)現(xiàn)類控制了集中化,把對(duì)象群交互的復(fù)雜性變?yōu)橹薪檎叩膹?fù)雜性。
    • 好處3:當(dāng)系統(tǒng)出現(xiàn)多對(duì)多交互復(fù)雜的對(duì)象群,可以考慮使用中介這模式。
    • 壞處1:中介者對(duì)象會(huì)較為復(fù)雜
    • eg:中介者模式一般應(yīng)用于一組對(duì)象以定義良好但是復(fù)雜的方式進(jìn)行通信的場(chǎng)合。以及想定制一個(gè)分布在多個(gè)類中的行為,而又不想生成太多的子類的場(chǎng)合
    • 問題描述:剛進(jìn)公司的新人需求其他部門同事幫忙是有困難的,但是通過主管協(xié)調(diào)就會(huì)簡單許多
      解決方案:
      • 通過中介者對(duì)象,可以將系統(tǒng)的網(wǎng)狀結(jié)構(gòu)變成以中介者為中心的星型結(jié)構(gòu),使得對(duì)象之間的耦合度變低、擴(kuò)展性增強(qiáng),系統(tǒng)的結(jié)構(gòu)不會(huì)因?yàn)樾聦?duì)象的引入造成大量的修改工作。
      • Mediator(抽象中介者類):定義了同事對(duì)象到中介者對(duì)象的接口。
      • ConcreteMediator(具體中介者對(duì)象):實(shí)現(xiàn)抽象類的方法,知道所有具體同事類,并從具體同事接受消息,向其他具體同事發(fā)送命令。
      • Colleague(抽象同事類):用于定義抽象的同事對(duì)象,
      • ConcreteColleague(具體同事類):每個(gè)具體同事只知道自己的行為,而不了解其他同事類的情況,但是他們認(rèn)識(shí)終結(jié)者對(duì)象。
    • 代碼實(shí)現(xiàn):
      • Mediator類:
      • abstract class Mediator {
            //定義一個(gè)抽象的發(fā)送消息方法,得到同事對(duì)象和發(fā)送消息
            public abstract void send(String message,Colleague colleague);
        }
      • ConcreteMediator類:
      • public class ConcreteMediator extends Mediator{
            public ConcreteColleague1 concreteColleague1;
            public ConcreteColleague2 concreteColleague2;
        
            public void setColleague1(ConcreteColleague1 value){
                this.concreteColleague1 = value;
            }
            public void setColleague2(ConcreteColleague2 value){
                this.concreteColleague2 = value;
            }
            @Override
            public void send(String message, Colleague colleague) {
                if(colleague == concreteColleague1){
                    concreteColleague2.notify(message);
                }else{
                    concreteColleague1.notify(message);
                }
            }
        }
      • Colleague類:
      • public class Colleague {
            protected Mediator mediator;
            // 構(gòu)建方法,得到中介者對(duì)象
            public Colleague(Mediator mediator){
                this.mediator = mediator;
            }
        }
      • ConcreteColleague類:
      • public class ConcreteColleague1 extends Colleague {
            public ConcreteColleague1(Mediator mediator) {
                super(mediator);
            }
            public void send(String message){
                this.mediator.send(message,this);
            }
            public void notify(String message){
                System.out.println("同事1得到信息:"+message);
            }
        }
        
        public class ConcreteColleague2 extends Colleague {
            public ConcreteColleague2(Mediator mediator)
            {
                super(mediator);
            }
            public void send(String message)
            {
                this.mediator.send(message,this);
            }
            public void notify(String message)
            {
                System.out.println("同事2得到信息:"+message);
            }
        }
      • 調(diào)用方
      • public class main {
            public static void main(String[] args){
                ConcreteMediator m =new ConcreteMediator();
                ConcreteColleague1 c1 = new ConcreteColleague1(m);
                ConcreteColleague2 c2 = new ConcreteColleague2(m);
                m.setColleague1(c1);
                m.setColleague2(c2);
                c1.send("吃過飯了嗎?");
                c2.send("沒有呢,你打算請(qǐng)客?");
            }
        }
      • 中介者模式通用結(jié)構(gòu)示意圖如下(引申)
        • image-20221017164911912
  • 參考資料:《深入設(shè)計(jì)模式》

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

成都創(chuàng)新互聯(lián)是一家專業(yè)提供維西企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為維西眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
當(dāng)前題目:No2.大話設(shè)計(jì)模式學(xué)習(xí)之橋聯(lián)、職責(zé)鏈、中介模式-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://weahome.cn/article/ccejgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部