CSharp: Bridge Pattern
/// <summary>
/// Summary description for VisList.
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
public interface VisList
{
//add a line to the display
void addLine(Product p);
//remove a line from the display
void removeLine(int num);
}
/// <summary>
/// Summary description for Bridger.
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
//Bridge interface to display list classes
public interface Bridger
{
void addData(ArrayList col);
}
/// <summary>
/// A simple file handlng class
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
public class csFile
{
private string fileName;
StreamReader ts;
StreamWriter ws;
private bool opened, writeOpened;
/// <summary>
///
/// </summary>
public csFile()
{
init();
}
/// <summary>
///
/// </summary>
private void init()
{
opened = false;
writeOpened = false;
}
/// <summary>
///
/// </summary>
/// <param name="file_name"></param>
public csFile(string file_name)
{
fileName = file_name;
init();
}
/// <summary>
///
/// </summary>
/// <param name="file_name"></param>
/// <returns></returns>
public bool OpenForRead(string file_name)
{
fileName = file_name;
try
{
ts = new StreamReader(fileName);
opened = true;
}
catch (FileNotFoundException)
{
return false;
}
return true;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public bool OpenForRead()
{
return OpenForRead(fileName);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public string readLine()
{
return ts.ReadLine();
}
/// <summary>
///
/// </summary>
/// <param name="s"></param>
public void writeLine(string s)
{
ws.WriteLine(s);
}
/// <summary>
///
/// </summary>
public void close()
{
if (opened)
ts.Close();
if (writeOpened)
ws.Close();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public bool OpenForWrite()
{
return OpenForWrite(fileName);
}
/// <summary>
///
/// </summary>
/// <param name="file_name"></param>
/// <returns></returns>
public bool OpenForWrite(string file_name)
{
try
{
ws = new StreamWriter(file_name);
fileName = file_name;
writeOpened = true;
return true;
}
catch (FileNotFoundException)
{
return false;
}
}
}
/// <summary>
/// Summary description for Product.
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
public class Product : IComparable
{
private string quantity;
private string name;
/// <summary>
///
/// </summary>
/// <param name="line"></param>
public Product(string line)
{
int i = line.IndexOf("--");
name = line.Substring(0, i).Trim();
quantity = line.Substring(i + 2).Trim();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public string getQuantity()
{
return quantity;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public string getName()
{
return name;
}
/// <summary>
///
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
public int CompareTo(object p)
{
Product prod = (Product)p;
return name.CompareTo(prod.getName());
}
}
/// <summary>
/// Summary description for ProductList.
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
//A VisList class for the ListBox
public class ProductList : VisList
{
private ListBox list;
/// <summary>
///
/// </summary>
/// <param name="lst"></param>
public ProductList(ListBox lst)
{
list = lst;
}
/// <summary>
///
/// </summary>
/// <param name="p"></param>
public void addLine(Product p)
{
list.Items.Add(p.getName());
}
/// <summary>
///
/// </summary>
/// <param name="num"></param>
public void removeLine(int num)
{
if (num >= 0 && num < list.Items.Count)
{
list.Items.Remove(num);
}
}
}
/// <summary>
/// Summary description for SortBridge.
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
public class SortBridge : ListBridge
{
/// <summary>
///
/// </summary>
/// <param name="v"></param>
public SortBridge(VisList v)
: base(v)
{
}
/// <summary>
///
/// </summary>
/// <param name="ar"></param>
public override void addData(ArrayList ar)
{
int max = ar.Count;
Product[] prod = new Product[max];
for (int i = 0; i < max; i++)
{
prod[i] = (Product)ar[i];
}
for (int i = 0; i < max; i++)
{
for (int j = i; j < max; j++)
{
if (prod[i].CompareTo(prod[j]) > 0)
{
Product pt = prod[i];
prod[i] = prod[j];
prod[j] = pt;
}
}
}
for (int i = 0; i < max; i++)
{
vis.addLine(prod[i]);
}
}
}
/// <summary>
/// Summary description for ListBridge.
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
public class ListBridge : Bridger
{
protected VisList vis;
/// <summary>
///
/// </summary>
/// <param name="v"></param>
public ListBridge(VisList v)
{
vis = v;
}
/// <summary>
///
/// </summary>
/// <param name="ar"></param>
public virtual void addData(ArrayList ar)
{
for (int i = 0; i < ar.Count; i++)
{
Product p = (Product)ar[i];
vis.addLine(p);
}
}
}
/// <summary>
/// Summary description for GridList.
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
public class GridList : VisList
{
private DataGridView grid;
private DataTable dtable;
private GridAdapter gAdapter;
//-----
public GridList(DataGridView grd)
{
grid = grd;
dtable = new DataTable("Products");
DataColumn column = new DataColumn("ProdName");
dtable.Columns.Add(column);
column = new DataColumn("Qty");
dtable.Columns.Add(column);
grid.DataSource = dtable;
gAdapter = new GridAdapter(grid);
}
/// <summary>
///
/// </summary>
/// <param name="p"></param>
public void addLine(Product p)
{
gAdapter.Add(p);
}
/// <summary>
///
/// </summary>
/// <param name="num"></param>
public void removeLine(int num)
{
}
}
/// <summary>
/// Summary description for GridAdapter.
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
public class GridAdapter
{
// private DataGridView DataGrid
private DataGridView grid;
private DataTable dTable;
private int row;
/// <summary>
///
/// </summary>
/// <param name="grd"></param>
public GridAdapter(DataGridView grd)
{
grid = grd;
dTable = (DataTable)grid.DataSource;
grid.MouseDown += new System.Windows.Forms.MouseEventHandler(Grid_Click);
row = -1;
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void Grid_Click(object sender, System.Windows.Forms.MouseEventArgs e)
{
DataGridView.HitTestInfo hti = grid.HitTest(e.X, e.Y);
if (hti.Type == DataGridViewHitTestType.Cell) //HitTestType.Cell
{
row = hti.RowIndex; // hti.Row;
}
}
//private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
//{
// // If the user right-clicks a cell, store it for use by the shortcut menu.
// if (e.Button == MouseButtons.Right)
// {
// DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y);
// if (hit.Type == DataGridViewHitTestType.Cell)
// {
// clickedCell =
// dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex];
// }
// }
//}
/// <summary>
///
/// </summary>
/// <param name="p"></param>
public void Add(Product p)
{
DataRow row = dTable.NewRow();
row[0] = p.getName();
row[1] = p.getQuantity();
dTable.Rows.Add(row);
dTable.AcceptChanges();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public int SelectedIndex()
{
return row;
}
/// <summary>
///
/// </summary>
public void Clear()
{
int count = dTable.Rows.Count;
for (int i = 0; i < count; i++)
{
dTable.Rows[i].Delete();
}
}
/// <summary>
///
/// </summary>
public void clearSelection() { }
}
窗体调用:
/// <summary>
/// 20220918
/// geovindu,Geovin Du,涂聚文
/// Bridge Patterns桥接
/// </summary>
public partial class BridgePatternsForm : Form
{
private ArrayList products;
private VisList prodList, gridList;
/// <summary>
///
/// </summary>
private void init()
{
products = new ArrayList();
readFile(products); //read in the data file
//create the product list
prodList = new ProductList(lsProd);
//Bridge to product VisList
Bridger lbr = new SortBridge(prodList);
//put the data into the product list
lbr.addData(products);
//create the grid VisList
gridList = new GridList(grdProd);
//Bridge to the grid list
Bridger gbr = new SortBridge(gridList);
//put the data into the grid display
gbr.addData(products);
}
/// <summary>
///
/// </summary>
/// <param name="products"></param>
private void readFile(ArrayList products)
{
csFile fl = new csFile("products.txt");
fl.OpenForRead();
string s = fl.readLine();
while (s != null)
{
Product p = new Product(s);
products.Add(p);
s = fl.readLine();
}
fl.close();
}
/// <summary>
///
/// </summary>
public BridgePatternsForm()
{
InitializeComponent();
init();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BridgePatternsForm_Load(object sender, EventArgs e)
{
}
}
输出:


哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号