《参考文献》
- C# Design Patterns 15. The Bridge Pattern.
BasicBridge_Forms.py
- Windows Forms アプリケーションとして、IronPython で実現した事例を紹介します。
# -*- coding: utf-8 -*-
#===============================================================================
# Copyright (C) 2000-2008, 小泉ひよ子とタマゴ倶楽部
#
# History: Design Pattern
# 2008/01/25, IronPython 1.1.1 (download)
# 2008/08/22, IronPython 1.1.2 (download)
# 2008/01/15, ver.1.0, Windows Forms
# 2008/09/28, ver.2.1, IronPython 1.1.2
#===============================================================================
import clr
clr.AddReference("System")
from System import *
clr.AddReference("System.Data")
from System.Data import *
clr.AddReference("System.Drawing")
from System.Drawing import *
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import *
csFile.cs
class csFile:
def __init__(self, file_name):
self.fileName = file_namedef file(self):
self.ts = file(self.fileName)
return self.ts
- StreamReader に代えて、組み込み型 file を利用しています。
def close(self):
self.ts.close()
Product.cs
class Product(IComparable):
def __init__(self, line):
i = line.index("--")
self.name = line[:i ].strip()
self.quantity = line[i+2:].strip()
Bridger.cs
class Bridger: # interface Bridger
def addData(self, col):
raise NotImplementedError("addData")
- interface に代えて、例外 NotImplementedError を生成しています。
ListBridge.cs
class ListBridge(Bridger):
def __init__(self, v):
self.vis = vdef addData(self, ar):
for e in ar:
self.vis.addLine(e)
VisList.cs
class VisList:
def addLine(self, p):
raise NotImplementedError("addLine")
- interface に代えて、例外 NotImplementedError を生成しています。
ProductList.cs
class ProductList(VisList):
def __init__(self, lst):
self.list = lstdef addLine(self, p):
self.list.Items.Add(p.name)
GridList.cs
class GridList(VisList):
def __init__(self, grd):
grid = grd
dtable = DataTable("Products")
for e in "ProdName", "Qty":
dtable.Columns.Add(DataColumn(e))
grid.DataSource = dtable
self.gAdapter = GridAdapter(grid)def addLine(self, p):
self.gAdapter.Add(p)
GridAdapter.cs
class GridAdapter:
def __init__(self, grd):
self.grid = grd
self.dTable = self.grid.DataSource
self.grid.MouseDown += self.Grid_Click
self.row = -1def Grid_Click(self, sender, e):
print "... Grid_Click(%s, %s)"%(sender,e)
hti = self.grid.HitTest(e.X, e.Y)
if hti.Type == DataGrid.HitTestType.Cell:
self.row = hti.Rowdef Add(self, p):
row = self.dTable.NewRow()
row[0] = p.name
row[1] = p.quantity
self.dTable.Rows.Add(row)
self.dTable.AcceptChanges()
Form1.cs
class BasicBridge_WPF(Form):
def __init__(self, **args):
self.InitializeComponent()
self.init()def init(self):
self.products = [] # ArrayList
self.readFile(self.products)
for e in ProductList(self.lsProd), GridList(self.grdProd):
ListBridge(e).addData(self.products)
- ArrayList に代えて、[] を利用しています。
def readFile(self, products):
fl = csFile("products.txt")
for s in fl.file().readlines():
products.append(Product(s))
else:
fl.close()
- file.readlines を利用しています。
- list.append を利用しています。
def InitializeComponent(self):
self.grdProd = self._grdProd()
self.lsProd = self._lsProd()
self._Controls()def _grdProd(self):
return DataGrid(
CaptionVisible = False,
Location = Point(184, 16),
Name = "grdProd",
RowHeadersVisible = False,
Size = Size(160, 176),
)def _lsProd(self):
return ListBox(
Location = Point(16, 16),
Name = "lsProd",
Size = Size(128, 173),
)
def _Controls(self):
for e in self.grdProd, self.lsProd:
self.Controls.Add(e)
self.ClientSize = Size(352, 229)
- Controls に各コントロールを追加します。
__main__
if __name__ == "__main__":
form = BasicBridge_Form()
form.Text = form.__class__.__name__
Application.Run(form)