C# 为什么在命令模式中没有从客户端到接收方和调用方的依赖关系箭头?
在OOP中,当类使用关键字new创建实例时,依赖关系存在。关于UML表示法,通过带有虚线的箭头显示依赖关系: 该网站显示了命令模式的代码及其UML。这个网站上的代码有一个客户端类,我认为它是MainApp,它包含三倍于new的关键字,用于为receiver、command和invoker创建一个实例C# 为什么在命令模式中没有从客户端到接收方和调用方的依赖关系箭头?,c#,design-patterns,uml,C#,Design Patterns,Uml,在OOP中,当类使用关键字new创建实例时,依赖关系存在。关于UML表示法,通过带有虚线的箭头显示依赖关系: 该网站显示了命令模式的代码及其UML。这个网站上的代码有一个客户端类,我认为它是MainApp,它包含三倍于new的关键字,用于为receiver、command和invoker创建一个实例 // Client class MainApp { /// <summary> /// Entry point into console application.
// Client
class MainApp
{
/// <summary>
/// Entry point into console application.
/// </summary>
static void Main()
{
// Create receiver, command, and invoker
Receiver receiver = new Receiver(); // <- no dashed arrow in UML
Command command = new ConcreteCommand(receiver); // <- dashed arrow in UML
Invoker invoker = new Invoker(); // <- no dashed arrow in UML
// [...]
}
}
abstract class Command
{
// [...]
}
class ConcreteCommand : Command
{
public ConcreteCommand(Receiver receiver) : base(receiver)
{
// [...]
}
// [...]
}
class Receiver
{
// [...]
}
class Invoker
{
// [...]
}
您可以在此处找到完整的代码:
为什么UML在此只显示客户端对具体命令的依赖性?因为客户端也在receiver和invoker上使用关键字new。我还希望依赖关系箭头指向UML中的接收方和调用方
这可能只是一个简单的示例,在现实世界中,应该让DI容器注入调用器和接收器。但是命令总是通过调用代码来指定的,不管怎样,您的代码都知道特定的ConcreteCommand这可能只是一个简单的示例,在现实世界中,您应该让DI容器注入invoker&receiver。但是命令总是通过调用代码来指定的。无论如何,从设计模式的角度来看,无论命令对象如何从创建它的客户机到执行它的调用程序,代码都知道特定的concrete命令。如果客户机直接将其传递给调用程序,因此具有直接依赖关系,则可以。如果客户机将命令持久化到数据库中,并且调用程序稍后检索该命令,也可以 从UML的角度来看,客户机和调用程序之间没有界限,因为不必有界限。添加这一行可能意味着需要依赖关系
从代码示例的角度来看,在一个主类中实例化所有内容既简单又直观,因此可以理解为什么在众多教程中看到它以这种方式实现。请记住,您可能会看到在现实世界中实现的模式有所不同,并且仍然遵循UML。从设计模式的角度来看,命令对象如何从创建它的客户机到执行它的调用方并不重要。如果客户机直接将其传递给调用程序,因此具有直接依赖关系,则可以。如果客户机将命令持久化到数据库中,并且调用程序稍后检索该命令,也可以 从UML的角度来看,客户机和调用程序之间没有界限,因为不必有界限。添加这一行可能意味着需要依赖关系
从代码示例的角度来看,在一个主类中实例化所有内容既简单又直观,因此可以理解为什么在众多教程中看到它以这种方式实现。请记住,您可能会看到在现实世界中实现的模式有所不同,并且仍然遵循UML。始终有一个用户或客户机从代码中的某个地方使用您的模式。有些技术,如DI,使用另一种方法创建对象,将其放入ram中,并将其注入代码中 出于这个原因,为了简化所有显示Gof模式的UML,显示了在代码中使用新关键字来创建对象的客户机 所以它只是使用New关键字来显示我们在客户端中的使用。在现实世界中,我们使用DI将依赖注入类中 您还可以看到另一个有价值的参考:
总是有一个用户或客户机从代码中的某个地方使用您的模式。有些技术,如DI,使用另一种方法创建对象,将其放入ram中,并将其注入代码中 出于这个原因,为了简化所有显示Gof模式的UML,显示了在代码中使用新关键字来创建对象的客户机 所以它只是使用New关键字来显示我们在客户端中的使用。在现实世界中,我们使用DI将依赖注入类中 您还可以看到另一个有价值的参考:
是的,代码属于图表。请参见此处:@qwerty__so:我已经从dofactory.com/net/command-design-pattern添加了主要代码片段。您是否因为使用工具创建了图表而抱怨?如果是,请参见此处我的答案:@qwerty____so:抱歉,我不准确。问题是,为什么我复制了UML和其他来源的网站显示没有依赖关系的UML。是的,代码属于图表。请参见此处:@qwerty__so:我已经从dofactory.com/net/command-design-pattern添加了主要代码片段。您是否因为使用工具创建了图表而抱怨?如果是,请参见此处我的答案:@qwerty____so:抱歉,我不准确。问题是,为什么我复制了UML和其他来源的网站显示没有依赖关系的UML。我喜欢你的答案。谢谢你的耐心。我喜欢你的回答。感谢您的耐心。这不是关于设计模式的问题,而是关于应用程序的问题
后者的但这可能正是造成混淆的原因。UML源于GoF设计模式书,所以我将其解释为一个模式问题。值得注意的是,自从该书于1994年出版以来,它早于UML规范;但既然我们在质疑没有一行,日期就没那么重要了。最终,答案是,缺失的环节是设计造成的,而不是偶然的遗漏。这不是关于设计模式的问题,而是关于后者的应用。但这可能正是造成混淆的原因。UML源于GoF设计模式书,所以我将其解释为一个模式问题。值得注意的是,自从该书于1994年出版以来,它早于UML规范;但既然我们在质疑没有一行,日期就没那么重要了。最终,答案是,缺失的环节是出于设计,而不是意外遗漏。