前言
本文為 【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ù)!)
目錄
一、中介者模式
中介者模式(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)顯示他們之間的通信。
??(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!
二、迭代器模式
迭代器模式(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。
??(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
三、解釋器模式
解釋器模式(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á)式的解析。
??(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
四、命令模式
命令模式(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)演示命令模式。
??(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é)任鏈模式
顧名思義,責(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è)記錄器。
??(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.
后記
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-421801.html
??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)!