Tag: 命令模式

如何在java中为动作实现简单的撤消/重做?

我已经创建了一个XML编辑器,我在最后阶段陷入困境:添加撤消/重做function。 当用户向JTree添加元素,属性或文本时,我只需要添加undo / redo。 我还是很新,但今天在学校我尝试(不成功)创建两个栈对象[],称为撤消和重做,并添加执行的动作。 例如,我有: Action AddElement() { // some code public void actionPerformed(ActionEvent e) { performElementAction(); } } performElementAction实际上只是向JTree添加了一个Element。 我想添加一种方法来将此操作添加到我的撤消堆栈中。 是否只有一种简单的方法来实现undo.push(执行整个动作)或其他什么? 抱歉听起来像坏人,但这就是我:(

应用命令模式的真实世界示例

命令模式可用于实现Transactional behavior (和Undo )。 但是我用谷歌搜索找不到这些例子。 我只能找到switched on或off灯泡的一些简单例子。 在哪里可以找到使用Command Pattern实现的/这些行为的编码示例(最好是Java )?

绘图应用程序中撤消/重做的命令模式

我想在一个小的绘图应用程序中实现undo / redo。 似乎命令模式非常适合使用,但我不确定如何最好地实现它。 据我了解模式,有必要在每个命令中包含: 用于重做的绘制操作的详细信息(例如,线 – >开始和结束点,自由格式线 – > GeneralPath ) 更改撤消之前组件的状态。 在这种情况下,这将是受命令影响的区域的小快照图像。 我的理解是,每个命令都需要“primefaces”或自包含,并具有撤消/重做该操作所需的所有信息。 不幸的是,这需要存储比我最初预期更多的信息。 对于一行,我们还必须考虑最初用于绘制它的Color , Stroke和RenderingHints类的东西。 这将我的“简单的小命令”变成了一些东西……在内存中更笨重,并且有更多的样板代码可以生成(每个都是可序列化的bean 1 )。 出于记忆保护的原因(大多数情况下),我想要“欺骗”命令的规范。 也许每100次更新都会备份整个绘图区域,但是不存储已更改图像的任何部分,只需为每次新的绘制操作重建最后(最多)100个命令。 但是在绘制每个零件之前确保Graphics对象的状态是正确的似乎是有问题的 – 这部分可能需要一条线,但RenderingHints在4个命令之前被更改, Color在98命令之前被更改,而Stroke仍然是最后227个命令也一样。 追求更高效的内存命令似乎将模式从“primefaces”方面抛到了窗外。 这反过来导致难以确定可能影响渲染的最早命令。 我是不是该: 寻找新的模式? 尝试通过调整模式来实现我的特殊需求? 将所有这些丢弃在垃圾箱中作为过早优化,并以最简单(并且最耗费内存消耗)的方式对其进行编码,以便遵循定义的命令模式? 更新 “每个都是一个可序列化的豆子”在第二个想法,没有。 我做了圆顶检查,发现Graphics2D (整齐地封装了绘制时使用的许多参数)不可序列化。 此外, BasicStroke 是可序列化的,但不存储笔划的粗细。 我可以创建许多属性的可序列化版本,但它似乎会产生更多的代码,所以我将放弃该规范。 同样。 我将只尝试在运行时存储对BufferedImage的引用。

Guava中的任何东西都类似于Functional Java的效果?

我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。 但是让我们面对现实吧,即使存在所有的函数式编程库,Java也不是一种函数式语言。 事实上,似乎有些FP库知道并期待这一点。 例如,在Functional Java中,有Effect类。 在Jedi FP库中,有Command接口。 这允许您 – 除其他外 – 将类型安全的命令模式应用于Iterable元素,而不需要令人讨厌的for循环样板。 Command makeCall = new Command { public void execute(PhoneNumber p) { p.call(); } } List phoneList = … FunctionalPrimitives.forEach( phoneList, makeCall ); 所以问题是,番石榴中有类似的东西吗? 在接受澄清后接受回复 我正在开发一个框架 ,它可以在一定的环境下帮助解决大多数Java FP库中固有的“垂直问题”。 所以我实际上不会像上面所示那样编写代码示例:即,显式声明Command一个新类实现及其所有垂直噪声icky-ness,只是为了在声明后立即应用它。 我更多地考虑实际的命令模式,其中可能有几个可能的命令在其他地方声明,并且只有其中一个被传递到想要迭代地应用它的代码中。 此外,我的框架的目标是使创建function接口对象(函数,谓词,命令,其他简单的lambda)更加惯用,而不是简单地将垂直问题移动到其他地方。 我早就意识到这不在番石榴的范围内。 但是,由于其他FP库中有类似Command的接口,我只想知道Guava中是否存在模拟。 使用我的框架的更完整的代码示例可能是这样的: class Stuff { private final Stuff CALLS_TO = callsTo(Stuff.class); // […]

Command模式如何将发送方与接收方分离?

Command模式有一个IReceiver接口,只有很少的方法,并且对应每个方法都有具体的Command对象(用execute()方法实现接口ICommand )。 我已经读过客户端知道具体的接收器和具体的命令,通常客户端在具体的命令对象中设置接收器对象。 那为什么说它解耦了发送者和接收者呢? 当客户端已经知道具体接收器时,我觉得这不是松散耦合,并且在这种情况下客户端也可以直接调用接收器对象上的API(方法)。

使用Command Design模式

任何人都可以用命令模式的简单例子来解释。 我在互联网上提到但我感到困惑。