国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

這篇具有很好參考價(jià)值的文章主要介紹了【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

本文為 【23種設(shè)計(jì)模式】行為型模式 相關(guān)內(nèi)容介紹,下邊將對(duì)訪問(wèn)者模式,模板模式,策略模式,狀態(tài)模式,觀察者模式備忘錄模式,中介者模式迭代器模式,解釋器模式,命令模式,責(zé)任鏈模式,具體包括它們的特點(diǎn)與實(shí)現(xiàn)等進(jìn)行詳盡介紹~

??博主主頁(yè):小新要變強(qiáng) 的主頁(yè)
??Java全棧學(xué)習(xí)路線可參考:【Java全棧學(xué)習(xí)路線】最全的Java學(xué)習(xí)路線及知識(shí)清單,Java自學(xué)方向指引,內(nèi)含最全Java全棧學(xué)習(xí)技術(shù)清單~
??算法刷題路線可參考:算法刷題路線總結(jié)與相關(guān)資料分享,內(nèi)含最詳盡的算法刷題路線指南及相關(guān)資料分享~
??Java微服務(wù)開(kāi)源項(xiàng)目可參考:企業(yè)級(jí)Java微服務(wù)開(kāi)源項(xiàng)目(開(kāi)源框架,用于學(xué)習(xí)、畢設(shè)、公司項(xiàng)目、私活等,減少開(kāi)發(fā)工作,讓您只關(guān)注業(yè)務(wù)!)


目錄

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)


一、中介者模式

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

中介者模式(Mediator Pattern)是用來(lái)降低多個(gè)對(duì)象和類之間的通信復(fù)雜性。這種模式提供了一個(gè)中介類,該類通常處理不同類之間的通信,并支持松耦合,使代碼易于維護(hù)。中介者模式屬于行為型模式。

1??介紹

意圖: 用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。

主要解決: 對(duì)象與對(duì)象之間存在大量的關(guān)聯(lián)關(guān)系,這樣勢(shì)必會(huì)導(dǎo)致系統(tǒng)的結(jié)構(gòu)變得很復(fù)雜,同時(shí)若一個(gè)對(duì)象發(fā)生改變,我們也需要跟蹤與之相關(guān)聯(lián)的對(duì)象,同時(shí)做出相應(yīng)的處理。

何時(shí)使用: 多個(gè)類相互耦合,形成了網(wǎng)狀結(jié)構(gòu)。

如何解決: 將上述網(wǎng)狀結(jié)構(gòu)分離為星型結(jié)構(gòu)。

關(guān)鍵代碼: 對(duì)象 Colleague 之間的通信封裝到一個(gè)類中單獨(dú)處理。

應(yīng)用實(shí)例:

  • 1、中國(guó)加入 WTO 之前是各個(gè)國(guó)家相互貿(mào)易,結(jié)構(gòu)復(fù)雜,現(xiàn)在是各個(gè)國(guó)家通過(guò) WTO 來(lái)互相貿(mào)易。
  • 2、機(jī)場(chǎng)調(diào)度系統(tǒng)。
  • 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(視圖)的中介者。

優(yōu)點(diǎn):

  • 1、降低了類的復(fù)雜度,將一對(duì)多轉(zhuǎn)化成了一對(duì)一。
  • 2、各個(gè)類之間的解耦。
  • 3、符合迪米特原則。

缺點(diǎn): 中介者會(huì)龐大,變得復(fù)雜難以維護(hù)。

使用場(chǎng)景:

  • 1、系統(tǒng)中對(duì)象之間存在比較復(fù)雜的引用關(guān)系,導(dǎo)致它們之間的依賴關(guān)系結(jié)構(gòu)混亂而且難以復(fù)用該對(duì)象。
  • 2、想通過(guò)一個(gè)中間類來(lái)封裝多個(gè)類中的行為,而又不想生成太多的子類。

注意事項(xiàng): 不應(yīng)當(dāng)在職責(zé)混亂的時(shí)候使用。

2??實(shí)現(xiàn)

我們通過(guò)聊天室實(shí)例來(lái)演示中介者模式。實(shí)例中,多個(gè)用戶可以向聊天室發(fā)送消息,聊天室向所有的用戶顯示消息。我們將創(chuàng)建兩個(gè)類 ChatRoom 和 User。User 對(duì)象使用 ChatRoom 方法來(lái)分享他們的消息。

MediatorPatternDemo,我們的演示類使用 User 對(duì)象來(lái)顯示他們之間的通信。

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

??(1)創(chuàng)建中介類。

ChatRoom.java:

import java.util.Date;
 
public class ChatRoom {
   public static void showMessage(User user, String message){
      System.out.println(new Date().toString()
         + " [" + user.getName() +"] : " + message);
   }
}

??(2)創(chuàng)建 user 類。

User.java:

public class User {
   private String name;
 
   public String getName() {
      return name;
   }
 
   public void setName(String name) {
      this.name = name;
   }
 
   public User(String name){
      this.name  = name;
   }
 
   public void sendMessage(String message){
      ChatRoom.showMessage(this,message);
   }
}

??(3)使用 User 對(duì)象來(lái)顯示他們之間的通信。

MediatorPatternDemo.java:

public class MediatorPatternDemo {
   public static void main(String[] args) {
      User robert = new User("Robert");
      User john = new User("John");
 
      robert.sendMessage("Hi! John!");
      john.sendMessage("Hello! Robert!");
   }
}

??(4)執(zhí)行程序

輸出結(jié)果:

Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!

二、迭代器模式

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

迭代器模式(Iterator Pattern)是 Java 和 .Net 編程環(huán)境中非常常用的設(shè)計(jì)模式。這種模式用于順序訪問(wèn)集合對(duì)象的元素,不需要知道集合對(duì)象的底層表示。

迭代器模式屬于行為型模式。

1??介紹

意圖: 提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又無(wú)須暴露該對(duì)象的內(nèi)部表示。

主要解決: 不同的方式來(lái)遍歷整個(gè)整合對(duì)象。

何時(shí)使用: 遍歷一個(gè)聚合對(duì)象。

如何解決: 把在元素之間游走的責(zé)任交給迭代器,而不是聚合對(duì)象。

關(guān)鍵代碼: 定義接口:hasNext, next。

應(yīng)用實(shí)例: JAVA 中的 iterator。

優(yōu)點(diǎn):

  • 1、它支持以不同的方式遍歷一個(gè)聚合對(duì)象。
  • 2、迭代器簡(jiǎn)化了聚合類。
  • 3、在同一個(gè)聚合上可以有多個(gè)遍歷。
  • 4、在迭代器模式中,增加新的聚合類和迭代器類都很方便,無(wú)須修改原有代碼。

缺點(diǎn): 由于迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離,增加新的聚合類需要對(duì)應(yīng)增加新的迭代器類,類的個(gè)數(shù)成對(duì)增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性。

使用場(chǎng)景:

  • 1、訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)須暴露它的內(nèi)部表示。
  • 2、需要為聚合對(duì)象提供多種遍歷方式。
  • 3、為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口。

注意事項(xiàng): 迭代器模式就是分離了集合對(duì)象的遍歷行為,抽象出一個(gè)迭代器類來(lái)負(fù)責(zé),這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu),又可讓外部代碼透明地訪問(wèn)集合內(nèi)部的數(shù)據(jù)。

2??實(shí)現(xiàn)

我們將創(chuàng)建一個(gè)敘述導(dǎo)航方法的 Iterator 接口和一個(gè)返回迭代器的 Container 接口。實(shí)現(xiàn)了 Container 接口的實(shí)體類將負(fù)責(zé)實(shí)現(xiàn) Iterator 接口。

IteratorPatternDemo,我們的演示類使用實(shí)體類 NamesRepository 來(lái)打印 NamesRepository 中存儲(chǔ)為集合的 Names。

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

??(1)創(chuàng)建接口

Iterator.java:

public interface Iterator {
   public boolean hasNext();
   public Object next();
}

Container.java:

public interface Container {
   public Iterator getIterator();
}

??(2)創(chuàng)建實(shí)現(xiàn)了 Container 接口的實(shí)體類。該類有實(shí)現(xiàn)了 Iterator 接口的內(nèi)部類 NameIterator。

NameRepository.java:

public class NameRepository implements Container {
   public String[] names = {"Robert" , "John" ,"Julie" , "Lora"};
 
   @Override
   public Iterator getIterator() {
      return new NameIterator();
   }
 
   private class NameIterator implements Iterator {
 
      int index;
 
      @Override
      public boolean hasNext() {
         if(index < names.length){
            return true;
         }
         return false;
      }
 
      @Override
      public Object next() {
         if(this.hasNext()){
            return names[index++];
         }
         return null;
      }     
   }
}

??(3)使用 NameRepository 來(lái)獲取迭代器,并打印名字。

IteratorPatternDemo.java:

public class IteratorPatternDemo {
   
   public static void main(String[] args) {
      NameRepository namesRepository = new NameRepository();
 
      for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
         String name = (String)iter.next();
         System.out.println("Name : " + name);
      }  
   }
}

??(4)執(zhí)行程序,輸出結(jié)果:

Name : Robert
Name : John
Name : Julie
Name : Lora

三、解釋器模式

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

解釋器模式(Interpreter Pattern)提供了評(píng)估語(yǔ)言的語(yǔ)法或表達(dá)式的方式,它屬于行為型模式。這種模式實(shí)現(xiàn)了一個(gè)表達(dá)式接口,該接口解釋一個(gè)特定的上下文。這種模式被用在 SQL 解析、符號(hào)處理引擎等。

1??介紹

意圖: 給定一個(gè)語(yǔ)言,定義它的文法表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該標(biāo)識(shí)來(lái)解釋語(yǔ)言中的句子。

主要解決: 對(duì)于一些固定文法構(gòu)建一個(gè)解釋句子的解釋器。

何時(shí)使用: 如果一種特定類型的問(wèn)題發(fā)生的頻率足夠高,那么可能就值得將該問(wèn)題的各個(gè)實(shí)例表述為一個(gè)簡(jiǎn)單語(yǔ)言中的句子。這樣就可以構(gòu)建一個(gè)解釋器,該解釋器通過(guò)解釋這些句子來(lái)解決該問(wèn)題。

如何解決: 構(gòu)建語(yǔ)法樹(shù),定義終結(jié)符與非終結(jié)符。

關(guān)鍵代碼: 構(gòu)建環(huán)境類,包含解釋器之外的一些全局信息,一般是 HashMap。

應(yīng)用實(shí)例: 編譯器、運(yùn)算表達(dá)式計(jì)算。

優(yōu)點(diǎn):

  • 1、可擴(kuò)展性比較好,靈活。
  • 2、增加了新的解釋表達(dá)式的方式。
  • 3、易于實(shí)現(xiàn)簡(jiǎn)單文法。

缺點(diǎn):

  • 1、可利用場(chǎng)景比較少。
  • 2、對(duì)于復(fù)雜的文法比較難維護(hù)。
  • 3、解釋器模式會(huì)引起類膨脹。
  • 4、解釋器模式采用遞歸調(diào)用方法。

使用場(chǎng)景:

  • 1、可以將一個(gè)需要解釋執(zhí)行的語(yǔ)言中的句子表示為一個(gè)抽象語(yǔ)法樹(shù)。
  • 2、一些重復(fù)出現(xiàn)的問(wèn)題可以用一種簡(jiǎn)單的語(yǔ)言來(lái)進(jìn)行表達(dá)。
  • 3、一個(gè)簡(jiǎn)單語(yǔ)法需要解釋的場(chǎng)景。

注意事項(xiàng): 可利用場(chǎng)景比較少,JAVA 中如果碰到可以用 expression4J 代替。

2??實(shí)現(xiàn)

我們將創(chuàng)建一個(gè)接口 Expression 和實(shí)現(xiàn)了 Expression 接口的實(shí)體類。定義作為上下文中主要解釋器的 TerminalExpression 類。其他的類 OrExpression、AndExpression 用于創(chuàng)建組合式表達(dá)式。

InterpreterPatternDemo,我們的演示類使用 Expression 類創(chuàng)建規(guī)則和演示表達(dá)式的解析。

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

??(1)創(chuàng)建一個(gè)表達(dá)式接口。

Expression.java:

public interface Expression {
   public boolean interpret(String context);
}

??(2)創(chuàng)建實(shí)現(xiàn)了上述接口的實(shí)體類。

TerminalExpression.java:

public class TerminalExpression implements Expression {
   
   private String data;
 
   public TerminalExpression(String data){
      this.data = data; 
   }
 
   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}

OrExpression.java:

public class OrExpression implements Expression {
    
   private Expression expr1 = null;
   private Expression expr2 = null;
 
   public OrExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }
 
   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) || expr2.interpret(context);
   }
}

AndExpression.java:

public class AndExpression implements Expression {
    
   private Expression expr1 = null;
   private Expression expr2 = null;
 
   public AndExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }
 
   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) && expr2.interpret(context);
   }
}

??(3)InterpreterPatternDemo 使用 Expression 類來(lái)創(chuàng)建規(guī)則,并解析它們。

InterpreterPatternDemo.java:

public class InterpreterPatternDemo {
 
   //規(guī)則:Robert 和 John 是男性
   public static Expression getMaleExpression(){
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);    
   }
 
   //規(guī)則:Julie 是一個(gè)已婚的女性
   public static Expression getMarriedWomanExpression(){
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);    
   }
 
   public static void main(String[] args) {
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();
 
      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}

??(4)執(zhí)行程序,輸出結(jié)果:

John is male? true
Julie is a married women? true

四、命令模式

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

命令模式(Command Pattern)是一種數(shù)據(jù)驅(qū)動(dòng)的設(shè)計(jì)模式,它屬于行為型模式。請(qǐng)求以命令的形式包裹在對(duì)象中,并傳給調(diào)用對(duì)象。調(diào)用對(duì)象尋找可以處理該命令的合適的對(duì)象,并把該命令傳給相應(yīng)的對(duì)象,該對(duì)象執(zhí)行命令。

1??介紹

意圖: 將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而使您可以用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化。

主要解決: 在軟件系統(tǒng)中,行為請(qǐng)求者與行為實(shí)現(xiàn)者通常是一種緊耦合的關(guān)系,但某些場(chǎng)合,比如需要對(duì)行為進(jìn)行記錄、撤銷或重做、事務(wù)等處理時(shí),這種無(wú)法抵御變化的緊耦合的設(shè)計(jì)就不太合適。

何時(shí)使用: 在某些場(chǎng)合,比如要對(duì)行為進(jìn)行"記錄、撤銷/重做、事務(wù)"等處理,這種無(wú)法抵御變化的緊耦合是不合適的。在這種情況下,如何將"行為請(qǐng)求者"與"行為實(shí)現(xiàn)者"解耦?將一組行為抽象為對(duì)象,可以實(shí)現(xiàn)二者之間的松耦合。

如何解決: 通過(guò)調(diào)用者調(diào)用接受者執(zhí)行命令,順序:調(diào)用者→命令→接受者。

關(guān)鍵代碼: 定義三個(gè)角色:

  • 1、received 真正的命令執(zhí)行對(duì)象
  • 2、Command
  • 3、invoker 使用命令對(duì)象的入口

應(yīng)用實(shí)例: struts 1 中的 action 核心控制器 ActionServlet 只有一個(gè),相當(dāng)于 Invoker,而模型層的類會(huì)隨著不同的應(yīng)用有不同的模型類,相當(dāng)于具體的 Command。

優(yōu)點(diǎn):

  • 1、降低了系統(tǒng)耦合度。
  • 2、新的命令可以很容易添加到系統(tǒng)中去。

缺點(diǎn): 使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過(guò)多的具體命令類。

使用場(chǎng)景: 認(rèn)為是命令的地方都可以使用命令模式,比如:

  • 1、GUI 中每一個(gè)按鈕都是一條命令。
  • 2、模擬 CMD。

注意事項(xiàng): 系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作,也可以考慮使用命令模式,見(jiàn)命令模式的擴(kuò)展。

2??實(shí)現(xiàn)

我們首先創(chuàng)建作為命令的接口 Order,然后創(chuàng)建作為請(qǐng)求的 Stock 類。實(shí)體命令類 BuyStock 和 SellStock,實(shí)現(xiàn)了 Order 接口,將執(zhí)行實(shí)際的命令處理。創(chuàng)建作為調(diào)用對(duì)象的類 Broker,它接受訂單并能下訂單。

Broker 對(duì)象使用命令模式,基于命令的類型確定哪個(gè)對(duì)象執(zhí)行哪個(gè)命令。CommandPatternDemo 類使用 Broker 類來(lái)演示命令模式。

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

??(1)創(chuàng)建一個(gè)命令接口。

Order.java:

public interface Order {
   void execute();
}

??(2)創(chuàng)建一個(gè)請(qǐng)求類。

Stock.java:

public class Stock {
   
   private String name = "ABC";
   private int quantity = 10;
 
   public void buy(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] bought");
   }
   public void sell(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] sold");
   }
}

??(3)創(chuàng)建實(shí)現(xiàn)了 Order 接口的實(shí)體類。

BuyStock.java:

public class BuyStock implements Order {
   private Stock abcStock;
 
   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   public void execute() {
      abcStock.buy();
   }
}

SellStock.java:

public class SellStock implements Order {
   private Stock abcStock;
 
   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   public void execute() {
      abcStock.sell();
   }
}

??(4)創(chuàng)建命令調(diào)用類。

Broker.java:

import java.util.ArrayList;
import java.util.List;
 
public class Broker {
   private List<Order> orderList = new ArrayList<Order>(); 
 
   public void takeOrder(Order order){
      orderList.add(order);      
   }
 
   public void placeOrders(){
      for (Order order : orderList) {
         order.execute();
      }
      orderList.clear();
   }
}

??(5)使用 Broker 類來(lái)接受并執(zhí)行命令。

CommandPatternDemo.java:

public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();
 
      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);
 
      Broker broker = new Broker();
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);
 
      broker.placeOrders();
   }
}

??(6)執(zhí)行程序

輸出結(jié)果:

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

五、責(zé)任鏈模式

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計(jì)模式屬于行為型模式。

在這種模式中,通常每個(gè)接收者都包含對(duì)另一個(gè)接收者的引用。如果一個(gè)對(duì)象不能處理該請(qǐng)求,那么它會(huì)把相同的請(qǐng)求傳給下一個(gè)接收者,依此類推。

1??介紹

意圖: 避免請(qǐng)求發(fā)送者與接收者耦合在一起,讓多個(gè)對(duì)象都有可能接收請(qǐng)求,將這些對(duì)象連接成一條鏈,并且沿著這條鏈傳遞請(qǐng)求,直到有對(duì)象處理它為止。

主要解決: 職責(zé)鏈上的處理者負(fù)責(zé)處理請(qǐng)求,客戶只需要將請(qǐng)求發(fā)送到職責(zé)鏈上即可,無(wú)須關(guān)心請(qǐng)求的處理細(xì)節(jié)和請(qǐng)求的傳遞,所以職責(zé)鏈將請(qǐng)求的發(fā)送者和請(qǐng)求的處理者解耦了。

何時(shí)使用: 在處理消息的時(shí)候以過(guò)濾很多道。

如何解決: 攔截的類都實(shí)現(xiàn)統(tǒng)一接口。

關(guān)鍵代碼: Handler 里面聚合它自己,在 HandlerRequest 里判斷是否合適,如果沒(méi)達(dá)到條件則向下傳遞,向誰(shuí)傳遞之前 set 進(jìn)去。

應(yīng)用實(shí)例:

  • 1、紅樓夢(mèng)中的"擊鼓傳花"。
  • 2、JS 中的事件冒泡。
  • 3、JAVA WEB 中 Apache Tomcat 對(duì) Encoding 的處理,Struts2 的攔截器,jsp servlet 的
    Filter。

優(yōu)點(diǎn):

  • 1、降低耦合度。它將請(qǐng)求的發(fā)送者和接收者解耦。
  • 2、簡(jiǎn)化了對(duì)象。使得對(duì)象不需要知道鏈的結(jié)構(gòu)。
  • 3、增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過(guò)改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,允許動(dòng)態(tài)地新增或者刪除責(zé)任。
  • 4、增加新的請(qǐng)求處理類很方便。

缺點(diǎn):

  • 1、不能保證請(qǐng)求一定被接收。
  • 2、系統(tǒng)性能將受到一定影響,而且在進(jìn)行代碼調(diào)試時(shí)不太方便,可能會(huì)造成循環(huán)調(diào)用。
  • 3、可能不容易觀察運(yùn)行時(shí)的特征,有礙于除錯(cuò)。

使用場(chǎng)景:

  • 1、有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,具體哪個(gè)對(duì)象處理該請(qǐng)求由運(yùn)行時(shí)刻自動(dòng)確定。
  • 2、在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。
  • 3、可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求。

注意事項(xiàng): 在 JAVA WEB 中遇到很多應(yīng)用。

2??實(shí)現(xiàn)

我們創(chuàng)建抽象類 AbstractLogger,帶有詳細(xì)的日志記錄級(jí)別。然后我們創(chuàng)建三種類型的記錄器,都擴(kuò)展了 AbstractLogger。每個(gè)記錄器消息的級(jí)別是否屬于自己的級(jí)別,如果是則相應(yīng)地打印出來(lái),否則將不打印并把消息傳給下一個(gè)記錄器。

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

??(1)創(chuàng)建抽象的記錄器類。

AbstractLogger.java:

public abstract class AbstractLogger {
   public static int INFO = 1;
   public static int DEBUG = 2;
   public static int ERROR = 3;
 
   protected int level;
 
   //責(zé)任鏈中的下一個(gè)元素
   protected AbstractLogger nextLogger;
 
   public void setNextLogger(AbstractLogger nextLogger){
      this.nextLogger = nextLogger;
   }
 
   public void logMessage(int level, String message){
      if(this.level <= level){
         write(message);
      }
      if(nextLogger !=null){
         nextLogger.logMessage(level, message);
      }
   }
 
   abstract protected void write(String message);
   
}

??(2)創(chuàng)建擴(kuò)展了該記錄器類的實(shí)體類。

ConsoleLogger.java:

public class ConsoleLogger extends AbstractLogger {
 
   public ConsoleLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("Standard Console::Logger: " + message);
   }
}

ErrorLogger.java:

public class ErrorLogger extends AbstractLogger {
 
   public ErrorLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("Error Console::Logger: " + message);
   }
}

FileLogger.java:

public class FileLogger extends AbstractLogger {
 
   public FileLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("File::Logger: " + message);
   }
}

??(3)創(chuàng)建不同類型的記錄器。賦予它們不同的錯(cuò)誤級(jí)別,并在每個(gè)記錄器中設(shè)置下一個(gè)記錄器。每個(gè)記錄器中的下一個(gè)記錄器代表的是鏈的一部分。

ChainPatternDemo.java:

public class ChainPatternDemo {
   
   private static AbstractLogger getChainOfLoggers(){
 
      AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
      AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
      AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
 
      errorLogger.setNextLogger(fileLogger);
      fileLogger.setNextLogger(consoleLogger);
 
      return errorLogger;  
   }
 
   public static void main(String[] args) {
      AbstractLogger loggerChain = getChainOfLoggers();
 
      loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
 
      loggerChain.logMessage(AbstractLogger.DEBUG, 
         "This is a debug level information.");
 
      loggerChain.logMessage(AbstractLogger.ERROR, 
         "This is an error information.");
   }
}

??(4)執(zhí)行程序

輸出結(jié)果:

Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is a debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.

后記

【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)

??Java全棧學(xué)習(xí)路線可參考:【Java全棧學(xué)習(xí)路線】最全的Java學(xué)習(xí)路線及知識(shí)清單,Java自學(xué)方向指引,內(nèi)含最全Java全棧學(xué)習(xí)技術(shù)清單~
??算法刷題路線可參考:算法刷題路線總結(jié)與相關(guān)資料分享,內(nèi)含最詳盡的算法刷題路線指南及相關(guān)資料分享~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-421801.html

到了這里,關(guān)于【23種設(shè)計(jì)模式】行為型模式詳細(xì)介紹(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包