設計模式之禪筆記5 訪問者模式

2021-07-26 08:31:35 字數 3676 閱讀 7592

定義:封裝一些作用於某種資料結構的各元素的操作。它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。

角色:

1. visitor抽象訪問者:宣告訪問者可以訪問哪些元素,具體到程式中就是visit方法的引數定義哪些物件是可以被訪問的。

2. concretevisitor:具體訪問者。

3. element抽象元素:宣告接收哪一類訪問者訪問。程式上是通過accept方法中的引數來定義的。

4. concreteelement:具體元素。

5. objectstructure:結構物件。元素產生著,一般容納在多個不用類、不同介面的容器。如list,set,map等。

通用原始碼:

public

abstract

class

element

public

class

concreteelement1

extends

element

//允許那個訪問者訪問

public

void

accept(ivisitor visitor)

}public

class

concreteelement2

extends

element

//允許那個訪問者訪問

public

void

accept(ivisitor visitor)

}public

inte***ce

ivisitor

public

class

visitor

implements

ivisitor

public

void

visit(concreteelement2 el2)

}public

class

objectstruture else

}}public

class

client

}

定義:當乙個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類。

狀態模式的核心就是封裝,狀態的變更引起了行為的變更。角色如下:

1. state:抽象狀態角色:負責物件狀態定義,並且封裝環境角色以實現狀態切換。

2. concretestate:具體狀態角色。完成兩個職責:本狀態下要做的事情以及本狀態如何過渡到其他狀態。

3. context環境角色:定義客戶端需要的介面,並且負責具體狀態的切換。

通用原始碼:

public

abstract

class

state

//行為1

public

abstract

void

handle1();

//行為2

public

abstract

void

handle2();

}public

class

concretestate1

extends

state

@override

public

void

handle2()

}public

class

concretestate2

extends

state

@override

public

void

handle2()

}public

class

context

//設定當前狀態

public

void

setcurrentstate(state currentstate)

//行為委託

public

void

handle1()

public

void

handle2()

}public

class

client

}

優點:

1. 結構清晰,避免了程式的複雜性。提高系統的可靠維護性。

2. 很好的體現了開閉原則和單一職責原則。

3. 封裝性好。狀態變更放置到類的內部來實現,外部的呼叫不用知道類內部如何實現狀態和行為的變更。

缺點:可能子類太多而導致類膨脹。

使用場景:

1. 行為隨狀態改變而改變的場景。例如許可權設計,人員的狀態不同即使執行相同的行為結果也會不同。

2. 條件、分支判斷語句的替代者。在程式中大量使用switch語句或者if判斷語句會導致程式結構不清晰。邏輯混亂,使用狀態模式可以很好的避免這個問題。

定義:給定一門語言,定義它的文字的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。

角色如下:

1. abstractexpression:抽象直譯器。

2. terminalexpression:終結符表示式。實現與文字中的元素相關聯的解釋操作。

3. nonterminalexpression:非終結符表示式。文字中的每條規則對應於乙個非終結表示式。

4. context:環境角色。

通用原始碼:

public

abstract

class

expression

public

class

terminalexpression

extends

expression

}public

class

nonterminalexpression

extends

expression

public object interpreter(context ctx)

}public

class

context

public

class

client

*///產生乙個完整的語法樹,由各個具體的語法分析進行解析

expression exp = stack.pop();

//具體元素進入場景

exp.interpreter(ctx);

}}

每個非終結符表示式都代表了乙個文法規則,並且每個文法規則都只關心自己周邊的文法規則的結果。每個終結符表示式呼叫自己周邊的非終結符表示式。

通常client是乙個封裝類。封裝的結果就是傳遞進來乙個規範語法檔案。解析器分析後產生結果並返回。避免了呼叫者與語法解析器的耦合關係。

優點:良好的擴充套件性。修改語法規則只要修改相應的非終結符表示式就可以了。若擴充套件語法則只要增加非終結符類就可以了。

缺點:

1. 解析器模式可能導致類膨脹。

2. 直譯器模式採用遞迴呼叫方法。

3. 效率問題。解析器模式採用了大量的迴圈和遞迴,效率是乙個不容忽視的問題。

使用場景:

1. 重**生的問題可以使用解析器模式。例如,分析處理多個應用伺服器每天產生的大量日誌。

2. 乙個簡單語法需要解釋的場景。例如sql語法分析。

最佳實踐:直譯器模式在實際的系統開發使用的非常少,因為他會引起效率,效能以及維護等問題。

設計模式之禪 訪問者模式

類圖有了,先按照類圖來實現一下吧!結果出來了,不過有點問題 各個部門的級別不同,管理的人眼也就不同,沒有必要都把所有的人員的資訊都看一遍 這個報表可能會改,展現形式也有可能改變 按照開閉原則,report方法已經寫死,不太符合,子類不能自行修改 遇到問題就改唄,先從設計圖紙下手 類圖改好了,如何能為...

設計模式筆記 訪問者模式

訪問者模式 表示乙個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。visitor類,為該物件結構中concretevisitor的每乙個類宣告乙個visit操作。訪問者介面為使用不同演算法的子類宣告訪問操作。public abstract clas...

設計模式筆記 訪問者模式

封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。visitor 抽象訪問者 抽象類或介面,宣告訪問者可以訪問哪些元素,具體到程式中就是visit方法的引數定義哪些物件是可以被訪問的 public inte ce ivisitorvisitor ...