gpt4 book ai didi

c# - 绘图程序中的装饰器模式

转载 作者:行者123 更新时间:2023-11-30 12:58:45 24 4
gpt4 key购买 nike

我想问一些关于装饰器模式的问题。

我正在尝试制作有关绘制形状的软件,例如:直线、矩形....当我点击表单中的“行”时,我想应用装饰器模式来生效....这是我的实现装饰器

class Composite
{}
class line, rect...: Composite
{}

interface UserCommand
{
void Excute();
}

class ClickStyle: UserCommand
{
Composite Concrete;
.....
}

class MoveStyle: UserCommand
{
Composite Concrete;
...
}

Composite Line = new Line();
if(LineClick)
Line = new BorderStyle(Line);
if(LineMove)
Line = new MoveStyle(Line);
....
To add Effect

但是当 User NotClick, NotMove 时如何去除这个 Effect 呢?

实验:我的线条同时具有点击和移动效果,我点击矩形 ...如何从线条中删除效果?

最佳答案

尽管装饰器模式非常适合这些类型的系统,但如果您需要能够删除任何当前效果,我认为普通的旧修饰符列表会更好地为您服务。所有这些都是意见,而不是基于专业经验。我还假设您有某种 Draw()Paint() 循环来重绘“脏”形状

考虑一个基本形状:

public class BaseShape
{
public List<BaseStyle> Styles {get;}

//...

public void Draw()
{
this.DrawMe();

foreach(var style in Styles)
{
style.Draw(this);
}
}

public void AddStyle(BaseStyle style){this.Styles.Add(style);}
public void RemoveStyle(BaseStyle style){this.Styles.Remove(style);}

protected abstract void DrawMe(); // Child class (eg Circle) knows how to draw the shape
}

public class BorderStyle : BaseStyle
{
public override void Draw(BaseShape shape)
{
// Draw a border as you would in your decorator.
}
}

这将允许您添加和删除样式以及共享您预先知道样式相同的样式实例。例如,表示形状已被选中/激活的轮廓。

public void Main()
{
var border = new BorderStyle(); // shared

var circle = new Circle();
circle.AddStyle(border);

var square = new Square();
square.AddStyle(border);

// Later you want to remove the border and add a drop shadow:
square.RemoveStyle(border);
square.AddStyle(new DropShadowStyle());
}

这也将允许一些优化,例如,如果修改器的属性发生变化,则只重绘修改器。例如,如果边框宽度得到更新。

这也可能与您的命令系统一起很好地工作,因为 Execute() 可以添加样式,并且 Undo() 可能具有逆向算法,即删除样式。

另一个好处(取决于您的应用允许的内容)是样式与其装饰的内容完全分离。例如,假设用户创建了一个红色的 4px 边框样式并希望将其保存以供将来使用,您可以轻松地将此样式序列化并用作模板以应用于将来的各种形状。

关于c# - 绘图程序中的装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28740185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com