• CSharp: Template Method Pattern


       /// <summary>
        /// Summary description for Triangle.
        /// Template Method Pattern 模板方法模式
        ///20220918
        /// geovindu,Geovin Du,涂聚文
        /// </summary>
        public abstract class Triangle
        {
    
            /// <summary>
            /// 
            /// </summary>
            private Point p1, p2, p3;
            /// <summary>
            /// 
            /// </summary>
            protected Pen pen;
            /// <summary>
            /// 
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <param name="c"></param>
            public Triangle(Point a, Point b, Point c)
            {
                p1 = a;
                p2 = b;
                p3 = c;
                pen = new Pen(Color.Black, 1);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="g"></param>
            public virtual void draw(Graphics g)
            {
                g.DrawLine(pen, p1, p2);
                Point c = draw2ndLine(g, p2, p3);
                closeTriangle(g, c);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="g"></param>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <returns></returns>
            public abstract Point draw2ndLine(Graphics g, Point a, Point b);
            /// <summary>
            /// 
            /// </summary>
            /// <param name="g"></param>
            /// <param name="c"></param>
            public void closeTriangle(Graphics g, Point c)
            {
                g.DrawLine(pen, c, p1);
            }
        }
    

      

       /// <summary>
        /// Summary description for StdTriangle.
        /// Template Method Pattern 模板方法模式
        ///20220918
        /// geovindu,Geovin Du,涂聚文
        /// </summary>
        public class StdTriangle : Triangle
        {
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <param name="c"></param>
            public StdTriangle(Point a, Point b, Point c) : base(a, b, c) 
            { }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="g"></param>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <returns></returns>
            public override Point draw2ndLine(Graphics g, Point a, Point b)
            {
                g.DrawLine(pen, a, b);
                return b;
            }
        }
    

      

       /// <summary>
        /// Summary description for IsocelesTriangle.
        /// Template Method Pattern 模板方法模式
        ///20220918
        /// geovindu,Geovin Du,涂聚文
        /// </summary>
        public class IsocelesTriangle : Triangle
        {
            private Point newc;
            private int newcx, newcy;
            /// <summary>
            /// 
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <param name="c"></param>
            public IsocelesTriangle(Point a, Point b, Point c)
                : base(a, b, c)
            {
                float dx1, dy1, dx2, dy2, side1, side2;
                float slope, intercept;
                int incr;
                dx1 = b.X - a.X;
                dy1 = b.Y - a.Y;
                dx2 = c.X - b.X;
                dy2 = c.Y - b.Y;
    
                side1 = calcSide(dx1, dy1);
                side2 = calcSide(dx2, dy2);
    
                if (side2 < side1)
                    incr = -1;
                else
                    incr = 1;
                slope = dy2 / dx2;
                intercept = c.Y - slope * c.X;
    
                //move point c so that this is an isoceles triangle
                newcx = c.X;
                newcy = c.Y;
                while (Math.Abs(side1 - side2) > 1)
                {
                    newcx = newcx + incr;    //iterate a pixel at a time until close
                    newcy = (int)(slope * newcx + intercept);
                    dx2 = newcx - b.X;
                    dy2 = newcy - b.Y;
                    side2 = calcSide(dx2, dy2);
                }
                newc = new Point(newcx, newcy);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <returns></returns>
            private float calcSide(float a, float b)
            {
                return (float)Math.Sqrt(a * a + b * b);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="g"></param>
            /// <param name="b"></param>
            /// <param name="c"></param>
            /// <returns></returns>
            public override Point draw2ndLine(Graphics g, Point b, Point c)
            {
                g.DrawLine(pen, b, newc);
                return newc;
            }
    
        }
    

      

    调用:

        /// <summary>
        /// Template Method Pattern 模板方法模式
        ///20220918
        /// geovindu,Geovin Du,涂聚文
        /// </summary>
        public partial class TemplateMethodPatternForm : Form
        {
    
            private ArrayList triangles;
            /// <summary>
            /// 
            /// </summary>
            private void init()
            {
                triangles = new ArrayList();
                StdTriangle t1 = new StdTriangle(new Point(10, 10),
                    new Point(150, 50),
                    new Point(100, 75));
                IsocelesTriangle t2 = new IsocelesTriangle(
                    new Point(150, 100), new Point(240, 40),
                    new Point(175, 150));
                triangles.Add(t1);
                triangles.Add(t2);
                Pic.Paint += new PaintEventHandler(TPaint);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void TPaint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                Graphics g = e.Graphics;
                for (int i = 0; i < triangles.Count; i++)
                {
                    Triangle t = (Triangle)triangles[i];
                    t.draw(g);
                }
            }
            /// <summary>
            /// 
            /// </summary>
            public TemplateMethodPatternForm()
            {
                InitializeComponent();
                init();
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void TemplateMethodPatternForm_Load(object sender, EventArgs e)
            {
    
            }
        }
    

      

    输出:

  • 相关阅读:
    拥有自己的代码生成器—Newlife.XCode模板编写教程
    基于Newlife.XCode的权限系统(含数据集权限)【设计篇】
    拥有自己的代码生成器—NewLife.XCode代码生成器分析
    利用javascript来转换GB2312到UNICONDE &#形式
    和荣笔记 从 Unicode 到 GB2312 转换表制作程式
    如何做SVN迁移
    和荣笔记 GB2312 字符集和编码说明
    asp对象化之:基于adodb.stream的文件操作类
    Unicode 汉字内码表
    微软建议的ASP性能优化28条守则 之三
  • 原文地址:https://www.cnblogs.com/geovindu/p/16748943.html
Copyright © 2020-2023  润新知