1a)機能の要求:Abstraction
任意のサービスを要求するときには、Bridge::Abstraction で規定されたプロトコルに従います。
## -------------------- Bridge::Abstraction class ListAbstraction: def addItems(self, items): raise NotImplementedError("addItems")
リスト項目を追加するときのプロトコル addItems を規定します。引数 items には、追加したい複数の項目を指定します。このとき、各項目がどのように表示されるか(how)には関わらず、何を表示したいか(what)だけを明確にします。
適用事例: Bridge パターン
what/how の役割分担で、すぐに思い浮かぶのは古典的な〈GoF〉Bridge パターンです。そこで、このパターンに、データバインディングを導入した事例を紹介します。
まず、パターンの復習から始めます。古典的な Bridge パターンを踏襲したのが、exBridgeList.py です。これを実行すると、次のようなウィンドウが現れます。
>ipy.exe exListView.py ItemList: AntiqueWhite GridList: 'Aqua'(0,255,255)
(左)リスト項目には、色の名前が表示されます。AntiqueWhite を選択すると(中)キャンバスにその色が表示されます。
(右)リスト項目には、色の名前と色成分(赤/緑/青)が表示されます。Aqua を選択すると(中)キャンバスにその色が表示されます。
左右のリスト項目は、提示する情報が違うだけで、選択した色をキャンバスに表示する機能は同じです。このように、目的は同じでもそれを実現する手段だけが異なるときには、Bridge パターンを適用できないか検討するだけの価値があります。
1b)機能の要求:RefinedAbstraction
Bridge::Abstraction では、Bridge::Abstraction で規定されたプロトコルに従って、任意のサービスを要求します。
## -------------------- Bridge::RefinedAbstraction class ColorList(ListAbstraction): def __init__(self, view): self.view = view def addItems(self, items): for e in items: self.view.append(e)
規定されたプロトコル addItems に従って、複数のリスト項目 items を追加します。各項目 e を追加したい(what)ときには、self.view のために規定されたプロトコル append に従います。このとき、各項目 e がどのように追加されるか(how)を知る必要はありません。