با اجازه دوست عزیزم مهندس فتح الهی
حالا یه اینترفیس تعریف میکنیم که فقط یه متد داره به نام Draw
حالا میرسیم به کلاس Helpers اصلیمون که میتونه هم استاتیک باشه و هم معمولی به دو شکل زیر
که فقط یه متد ساده Draw داره و اونم تابع Draw اینترفیسی که بش دادیم رو صدا میزینه
نکته: این کلاس رو اگه با Func ایجاد کنیم خیلی بهتر و تمیزتر وقشنکتر هم میشد که من میگزرم فعلا ازش
من به نظرم Helpers رو اگه به شکل زیر Re factor کنیم بهتر باشه :)
اول یه کلاس تعریف میکنیم و اطلاعات لازم برای ترسیم پیش نمایش رو تو اون کلاس میزاریم
public class ShapeSpecification { public PointF StartPoint{get;set;} public PointF EndPoint{get;set;} public Color ForeColor{get;set;} public byte Thickness{get;set;} public bool IsFill{get;set;} public Brush BackgroundBrush{get;set;} }
یه کلاس دیگه هم نقاط ابتدا و انتها و طول و عرض رو تو خودش داره
public class StartPoints { public float XPoint { get; set; } public float YPoint { get; set; } public float Width { get; set; } public float Height { get; set; } }
public interface IPeiview { void Draw(ShapeSpecification shapeScepification); }
public class Helpers { private readonly IPeiview peiview; public Helpers(IPeiview peiview) { this.peiview = peiview; } public void Draw(ShapeSpecification shapeSpecification) { peiview.Draw(shapeSpecification); } }
public static class Helpers { public static void Draw(ShapeSpecification shapeSpecification, IPeiview peiview) { peiview.Draw(shapeSpecification); } }
یه کلاس دیگه هم تعریف میکنیم که مسئولیتش تشخیص بومهای چهارگانه است برای شروع نقطهی ترسیم
public static class AreaParser { public static StartPoints Parse(PointF startPoint, PointF endPoint) { var startPoints = new StartPoints(); startPoints.Width = Math.Abs(endPoint.X - startPoint.X); startPoints.Height = Math.Abs(endPoint.Y - startPoint.Y); if (startPoint.X <= endPoint.X && startPoint.Y <= endPoint.Y) { startPoints.XPoint = startPoint.X; startPoints.YPoint = startPoint.Y; } else if (startPoint.X >= endPoint.X && startPoint.Y >= endPoint.Y) { startPoints.XPoint = endPoint.X; startPoints.YPoint = endPoint.Y; } else if (startPoint.X >= endPoint.X && startPoint.Y <= endPoint.Y) { startPoints.XPoint = endPoint.X; startPoints.YPoint = startPoint.Y; } else if (startPoint.X <= endPoint.X && startPoint.Y >= endPoint.Y) { startPoints.XPoint = startPoint.X; startPoints.YPoint = endPoint.Y; } return startPoints; } }
حالا ما هر شکل جدید که اضافه کنیم به پروژه Paint خودمون و قصد پیش نمایش اونو داشته باشیم فقط کافیه یه کلاس برا پیش نمایشش ایجاد کنیم که کلاس Ipreview رو Implement کنه و متد Draw مخصوص به خودش را داشته باشه و از شر Swithهای طولانی خلاص میشیم مثلا من برای دایره اینکارو کردم
public class CirclePreview:IPeiview { private readonly Graphics graphics; public CirclePreview(Graphics graphics) { this.graphics = graphics; } public void Draw(ShapeSpecification shapeScepification) { var startPoints = AreaParser.Parse(shapeScepification.StartPoint, shapeScepification.EndPoint); float raduis = Math.Max(startPoints.Width, startPoints.Height); if (shapeScepification.IsFill) this.graphics.FillEllipse(shapeScepification.BackgroundBrush, startPoints.XPoint, startPoints.YPoint, raduis, raduis); else this.graphics.DrawEllipse(new Pen(shapeScepification.ForeColor, shapeScepification.Thickness), startPoints.XPoint, startPoints.YPoint, raduis, raduis); } }