design-patterns - 我需要询问对象类,但这是一种不好的做法。这种情况的替代方案?

标签 design-patterns uml visitor-pattern double-dispatch

我在扩展应用程序时遇到问题。
这是一个考勤记录系统。目前,每个员工都通过一张带有二维码的卡记录考勤。现在他们想加入指纹识别,直到他们要求两种形式的识别必须在系统中共存时才出现问题。因此,系统必须能够感知员工的二维码,以及他的指纹。

I have the following classes:

通过 .equalsTo(id) 方法在 QrIdStrategy 中修复它的方法是:

equalsTo(id){
  if (id == isKindOf (QrIdStrategy))
    if (this.getEmployeeId () == id.getEmployeeId ())
      return true;

  return false;
}

但是我知道询问对象的类是一种不好的做法,并且不想这样做。我该如何解决?

我想到了访问者模式,但是我仍然有比较两个不同类型的类的问题(因为系统可以扫描这两种类型中的任何一种)

enter image description here

最佳答案

也许第一张图已经显示了我要说的内容,但这归结为多态性。

创建一个抽象类(例如 IdentificationStrategy 使用一些方法,如 equlasTo() )。派生两个类:QRStrategyFingerPrintStrategy来自 IdentificationStrategy并实现equlasTo()他们每个人的方法。

现在,代码中有一个地方可以让您知道是否要创建 QRStrategy 的实例。或 FingerPrintStrategy .只需将该对象的一个​​实例分配给 IdentificationStrategy 的变量即可类型(例如,让我们将其命名为 'foo' )。当您调用equlasTo() 'foo' 上的方法,你不再关心对象类型了。

关于design-patterns - 我需要询问对象类,但这是一种不好的做法。这种情况的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16219461/

相关文章:

c++ - C++中的内存管理模式

php - 无法理解序列图

c++ - 使用 "Enterprise Architect"逆向工程 C++ 代码

design-patterns - OCaml 中的访问者设计模式

c# - 自定义访客模式实现

java - View 和 Controller 之间的封装

java - 当一个类不想在其父类(super class)中声明所有方法时,如何将其视为子类?

c++ - 关于单例

deployment - 如何检查我的 UML 部署图是否符合 UML?

c++ - 如何制作更安全的 C++ 变体访问者,类似于 switch 语句?