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)を知る必要はありません。


Previous|1/3|Next