4

誰かがデザインパターンCompositeとChainofResponsibilityを一緒に使用する実際的な例を挙げられますか?

ありがとう

4

3 に答える 3

4

非常に実用的な例は、Qt フレームワークなどの GUI 設計です。

QObject は、個々のオブジェクトまたは複数のオブジェクトの複合体にすることができます。QObject は (理想的には) 親の QObject を知っているため、一連の責任も形成します。

例: メイン ウィンドウにはダイアログ (QObject) があります。ダイアログには、入力行とレイアウト ボックス (すべて QObjects) があります。レイアウト ボックスには 2 つのボタンがあります (すべて QObjects)。

ボタンへのイベント (クリックなど) は、QObject がイベントを処理できるようになるまで、一連の責任を通じて渡されます。

他の方向も機能します (複合設計のため)。ダイアログへの show() が子オブジェクトに渡されるため、入力行とレイアウト ボックスとボタンも表示されます。

于 2016-08-03T10:04:09.433 に答える
2

現実的な答えは不可能かもしれませんが、責任の連鎖がどのように構成されているかはわかります。pythonish の例を次に示します。

>>> class DevelopmentPerformanceMonitor():
...   def getPerformanceMonitorHandlers():
...     return []
... 
>>> class ProductionPerformanceMonitor():
...   def getPerformanceMonitorHandlers():
...     return [check_cpu_under_load, check_available_hd]
... 
>>> class DevelopmentExceptionMonitor():
...   def getExceptionHandlers():
...     return [email_local_root, log_exception]
... 
>>> class ProductionExceptionMonitor():
...   def getExceptionHandlers():
...     return [emails_system_admin, log_exception, create_ticket]
... 
>>> class SomeSystem:
...    pm = None # Performance Monitor
...    em = None # Exception Monitor
...    def __init__(self, performance_monitor, exception_monitor):
...      pm = performance_monitor
...      em = exception_monitor
...    def on_exception(e):
...      for handler in em.getExceptionHandlers():
...        handler(e)
...    def perform_performance_monitoring(s):
...      for handler in pm.getPerformanceMonitorHandlers():
...        handler(s)

したがって、SomeSystem オブジェクトは performance_monitor と exception_monitor の複合体です。各コンポジットは、必要な一連の責任の一連のハンドラーを返します。この例は、チェーン自体で SomeSystem を開始できる、より単純な責任のチェーンを複雑にするだけですが。それらをパッケージ化しておくと役立つ場合がありますが。

于 2010-03-16T02:39:35.413 に答える