この例では、MFC単一ドキュメントビューに基づいて、TreeCtrlの別のサブアイテムをクリックしてTabCtrlコントロールの対応するTABページを動的に生成します。一部のTABページが生成されている場合は、対応するTreeCtrlサブアイテムをクリックして、TABをサポートする生成されたTABページに切り替えます。ページを右クリックしてメニューを閉じ、ダブルクリックして機能を閉じます。
ファイル:n459.com/file/25127180-479632636アクセスパスワード:551685
以下は関係ありません。
- - - - - - - - - - - - - - - - - - - - - -境界線 - - - ----------------------------------------
みなさん、こんにちは。今日は新しいデザインパターンであるオブザーバーパターンを理解するようになりました。
オブザーバーモードの考え方は非常にシンプルで、さまざまなデータ監視で広く使用されています。多くの場合、特定のデータの変更を監視し、変更を知ったらすぐに何らかのアクションを実行したいと考えています。通常の操作では、監視するために追加のスレッドを開く必要があります。ただし、スレッドを開始するのは非常に面倒であり、追加のオーバーヘッドをもたらす必要があります。本日紹介したオブザーバーモードでは、不要なオーバーヘッドなしでこの機能を完了できます。
オブザーバー
オブザーバーモードでは、実行フロー全体が通常の操作とは逆になり、データの変更を監視するために一部のプログラムを使用しません。代わりに、データが変更されると、対応するリスナーにデータが変更されたことを通知します。また、不要な費用を回避できるメリットについても説明しました。
まず、2つのリスナーを実装しましょう。つまり、これら2つのリスナーは、データが変更されたときにトリガーされます。このデザインパターンでは、リスナーはビューアと呼ばれ、ここでの観測はアクティブな観測ではなく、パッシブな通知です。名前を付けた人は、これ以上の名前を思いつかないかもしれませんが、実際には、レシーバーと呼ぶべきだと思います。
クラスIncreaseViewer:
def __init__(self):
self.data = 0
def update(self, subject):
# 判断是否增加
if subject.data > self.data:
print('Increased: Subject {} data increased to {}'.format(subject.name, subject.data))
self.data = subject.data
クラスDeclineViewer:
def __init__(self):
self.data = 0
def update(self, subject):
# 判断是否减少
if subject.data < self.data:
print('Decreased: Subject %s data decreased to %d' % (subject.name, subject.data))
self.data = subject.data
データ
オブザーバーのコードをよく理解する必要があります。オブザーバークラスを理解した後、データクラスを見てみましょう。
データクラスは実際には非常に単純です。データが割り当てられたときにオブザーバーに通知できるように関数を設計するだけで済みます。Pythonでは、割り当て操作を直接認識できないことは誰もが知っていますが、クラスのメンバーが変更された場合は、@ propertyデコレータを使用して変更できます。
したがって、これを使用してデータクラスを実装します。@ propertyアノテーションに精通している場合は、非常に簡単です。
クラスData(Subject):
def __init__(self, name=''):
Subject.__init__(self)
self.name = name
self._data = 0
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self._data = data
# 关键
self.notify()
dataメソッドでself.notifyを見たことがありますか?これは通知機能であるため、Dataクラスのデータメンバーが変更された場合、通知操作を実行してオブザーバーに実行を通知します。
オブザーバーの管理オブザーバー
が実装されたので、データクラスがあり、残りは2つを接続することです。もちろん、コードで簡単かつ無礼に実装することもできますが、データとオブザーバーの間の接続を簡単に管理することをお勧めします。データが異なれば必要なオブザーバーも異なる可能性があるため、単純かつ大まかに一般化することはできません。
実際、オブザーバーの管理はそれほど複雑である必要はなく、オブジェクト指向のアプローチでリストを単純にカプセル化するだけです。
クラスの件名:
def __init__(self):
self._observer = []
def attach(self, observer):
if observer not in self._observer:
self._observer.append(observer)
def detach(self, observer):
try:
self._observer.remove(observer)
except ValueError:
pass
def notify(self, modifier=None):
for observer in self._observer:
if modifier != observer:
observer.update(self)
アタッチとは、オブザーバーをデータに関連付けることを意味し、デタッチとは、関連付けを解除することを意味し、通知は当然のことながら通知です。実際、ループを使用してすべてのオブザーバーをトラバースし、対応する更新関数を実行することです。
ここでのロジックを単純化するために、SubjectクラスをDataクラスの親クラスにしました。これは、オブザーバーとデータをある程度分離することと同じです。将来、ロジックのどの部分を変更または最適化しても、他の2つのパーティには影響しません。コード全体はわずか50行であり、Pythonだけでなく、多態性を使用する他の言語にとっても非常に単純であると言えます。この設計パターンも適用できます。