你會說Objective-C類別是visitor design pattern的實現嗎?Objective-C類別==訪客模式?
4
A
回答
11
不,Objective-C類別不是訪客模式的實現。在設計模式世界中,類別實際上並不完全匹配,因爲在大多數語言中將方法注入到沒有子類的現有類中是不可能的。我想說它更接近decorator pattern,但是這種模式通常是通過合成來實現的,即通過包裝要「增強」的對象實例。
訪問者模式對於封裝可應用於各種對象,結構等的算法邏輯非常有用。例如,如果要爲對象圖形創建HTML輸出,可以(A)編寫(B)使用訪問者模式並創建一個知道如何爲其訪問的每個節點生成HTML輸出的具體訪問者。
前一種方法更通用,任務T的邏輯分散在X,Y和Z類的小塊中。後一種方法將所有相關代碼放在單個訪問者對象中,這往往會簡化維護和防止「我忘了一堂課......」的問題。然而,對於簡單的情況來說,訪問者模式可以說有些過分 - 當它有幾個不同的並行功能並且希望從正在執行功能的類中抽象邏輯時,它確實值得回報。例如,您可以實現其他訪問者,這些訪問者可以產生PDF或RTF輸出等。每個訪問者可以按照必要的順序來處理遞歸併調用其自己的訪問方法,並且單獨的訪問者可以使用完全不同的順序。
應該指出,在許多語言中,訪問者模式使用方法重載(相同名稱,不同簽名/參數)。由於Objective-C不允許重載方法,因此您必須使用不同的方法名稱,但這實際上可以幫助避免因不知道哪個重載被調用而導致的錯誤。
2
類別可用於實現訪問者模式。
@protocol Visit
- (void)acceptVisitor:(MyVisitor *)visitor;
@end
@interface Foo (Visit) <Visit>
@end
@interface Bar (Visit) <Visit>
@end
@implementation MyVisitor
- (void)visit:(id)someObject {
if ([someObject conformsToProtocol:@protocol(Visit)]) {
[(id<Visit>)someObject acceptVisitor:self];
}
}
- (void)visitFoo:(Foo *)foo { ... }
- (void)visitBar:(Bar *)bar { ... }
@end
@implementation Foo (Visit)
- (void)acceptVisitor:(MyVisitor *)visitor {
[visitor visitFoo:self];
}
@end
@implementation Bar (Visit)
- (void)acceptVisitor:(MyVisitor *)visitor {
[visitor visitBar:Self];
}
@end
這是IMO比經典的GoF Visitor設計更簡潔,因爲沒有被訪問類的公共接口的污染,整個事情可以在訪問者類的編譯單元進行封裝。
相關問題
- 1. 類型列表訪客模式示例
- 2. 訪客設計模式 - 返回類型
- 3. 訪客設計模式
- 4. 訪客和複合模式
- 5. 訪客模式的實施
- 6. 訪客模式說明
- 7. 設計師設計模式與訪客設計模式的區別
- 8. 訪客和複合模式之間的區別?
- 9. 訪客和策略模式有什麼區別?
- 10. 使用訪客模式檢查派生類的類型?
- 11. 使用模板實現「訪客模式」
- 12. 模塊中的Joomla類別博客
- 13. Drupal 7 - 博客模塊 - 類別?
- 14. 訪客模式 - 添加新的ConcreteElement類很困難?
- 15. 訪客模式+打開/關閉原理
- 16. 訪客設計模式與內樹
- 17. 訪客模式中使用accept()
- 18. 訪客模式和邏輯操作
- 19. 訪客設計模式 - 電子商務
- 20. 訪客模式:更改對象狀態?
- 21. 訪客模式提升::任何
- 22. 模板和樣式位訪客
- 23. 簡單的訪客模式故障
- 24. 訪客模式Java和全局變量
- 25. 訪客模式的用途與例子
- 26. 訪問者模式接受不識別對象的類
- 27. 的ObjectiveC,創建類的
- 28. 從ObjectiveC類中引用UIViewController
- 29. 的ObjectiveC類別不進口,但仍運行代碼
- 30. ObjectiveC執行和打字的類別和速度