• 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)
            {
    
            }
        }
    

     输出:

  • 相关阅读:
    P1093 奖学金
    华容道
    回文数
    P1654 OSU!
    Noip P1063 能量项链
    Noip 寻宝
    NOIP 2009 普及组 第三题 细胞分裂
    拦截器
    OGNL
    Struts2 配置详解
  • 原文地址:https://www.cnblogs.com/geovindu/p/16717429.html
Copyright © 2020-2023  润新知