CSharp: Template Method Pattern

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/// <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);
     }
 }

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/// <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;
     }
 }

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/// <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;
     }
 
 }

  

调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/// <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)
    {
 
    }
}

  

输出:

 

posted @   ®Geovin Du Dream Park™  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示