gpt4 book ai didi

design-patterns - 图像编辑工具的高级设计模式

转载 作者:行者123 更新时间:2023-12-04 07:15:06 27 4
gpt4 key购买 nike

我最近开始创建一个图像编辑工具来满足一个非常特殊的需求。对于将要使用它的人来说,这和我自己的娱乐一样多。但是,我很早就遇到了一些架构障碍。

像任何图像编辑器一样,用户将使用“工具”来绘制和操作图像。我的第一次尝试包括一个简单的界面:

public interface IDrawingTool
{
void DrawEffect( Graphics g );
// other stuff
}

这(我认为)会很好而且很干净,并且可以轻松维护和扩展。只需添加接口(interface)对象并在运行时调用所选对象的 DrawEffect 方法。

这种方法的问题是不同的绘图工具不能干净地遵循一个界面。例如,钢笔工具只需要知道要绘制的点就可以工作。然而,矩形需要单击的第一个点以及当前位置。多边形工具需要跟踪多次鼠标点击。

我很难想出一个很好的方法来实现这一点。我现在能想到的最好的方法是为每个工具添加一个 switch 语句和一个 case,这意味着绘图逻辑将在 Canvas 类中,而不是由 Tool 类型的对象封装。因为这是实践,我想以正确的方式做到这一点。感谢您提前提供任何帮助。

最佳答案

你如何设计你的界面有点复杂?让我们从一些代码开始,然后我将解释它应该如何工作。

public class AbstractDrawingTool {

private Graphics g;

void AbstractDrawingTool( Graphics g ) {
this.g = g;
}

void keyDown(KeyEvent e);
void keyUp(KeyEvent e);
void mouseMove(MouseEvent e);
void mouseClick(MouseEvent e);
void drop();
// other stuff
}

这个想法是一旦用户开始使用特定的实现,就将用户输入传递给工具。这样,您可以使用相同的界面创建许多不同的绘图工具。例如,一个简单的 PointDrawingTool 只会实现 mouseClick 事件以在 Canvas 上放置一个点。 PolygonDrawingTool 还将实现 keyUp 事件,以便在按下特定键(即转义键)时停止绘制线条。

一个特例是 drop 方法。它将被称为“删除”当前选定的工具。如果从工具栏或类似工具中选择另一个实现,就会发生这种情况。

您还可以将此定义与命令模式结合使用。在这种情况下,AbstractDrawingTool 的实现将负责创建 Command 接口(interface)的实例,并可能在操作完成后将它们放在堆栈上(即在 Canvas 上放置一个点)。

关于design-patterns - 图像编辑工具的高级设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/718342/

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