csharp: bridge patterns_®geovin du dream park™-编程思维

 

   /// <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)
        {

        }
    }

 输出:

 

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/geovindu/p/16717429.html

设计模式之备忘录模式_程序员田同学-编程思维

无论是我们在使用word还是记事本,系统都会为我们提供撤销的功能,这几乎是人人都会使用到的功能,而在我们实际开发中,会不会存在一个很复杂的对象,当更改了其中的某一个属性以后,也提供撤销的功能,可以快速恢复到更新前的状态。提供该功能的模式也正是今天的主题——备忘录模式。 一、概念理解 书上备忘录的解释是,在不破坏封装的前

设计模式之单例模式_blue星空-编程思维

0. 单例模式准备     0.1 单例模式的作用        0.1.1 一个类只有一个实例        0.1.2 该实例能够通过一个全局的方法获取到     0.2 单例模式适用场景:       0.2.1 多线程之间操作一个对象【共享一个资源】       0.2.2 性能优化,减少创建对象的消耗【创建时

设计模式之策略模式_blue星空-编程思维

  策略(Strategy)模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法时的处理策略。简单来说,策略模式定义了一个算法家族,并让这些算法可以互换。        传统模式是通过继承处理多种算法或行为。该方式需要大量的子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法