如何在OOP中设计嵌套多态性?

2024-06-26

假设我们的在线商店有一个简单的支付功能。我们希望使用不同的交易处理器来管理不同的交易:

  • 交易可以是付款或退款。
  • 交易处理器可以是 Paypal 或 Payplug。

所以我们有以下课程:

class PaymentTransaction implements Transaction {

}

class RefundTransaction implements Transaction {

}

class PaypalProcessor implements Processor {

}

class PayplugProcessor implements Processor {

}

怎样才能更好地理解OOP呢?

  1. Processor.process(transaction); or
  2. Transaction.process(processor);

例如,如果我们以示例1为例,如何避免以下情况switch陈述?

class PaypalProcessor {

    function process(Transaction transaction) {
        switch(transaction.getType()) {
            case payment:
            //..
                break;
            case refund:
            //..
  }
}

在所有情况下,如何管理“嵌套”多态性、策略或其他东西,以便能够管理不同处理器的不同事务?

PS:如果标题不合适,请告诉我,我会编辑它。


你似乎走在正确的轨道上。您需要的是用于执行操作的第三个类(为了讨论,Java 中的示例代码):

class PaymentProcessor { 
     private Processor processor;
     private Transaction transaction;

     public PaymentProcessor(Processor processor, Transaction transaction) {
          this.processor = processor;
          this.transaction = transaction;
     }

     public void processPayment() {
         processor.process(transaction);
     }
 }

那么你可以inject适当实施Processor and Transaction进入PaymentProcessor :

PaymentProcessor paymentProcessor = new PaymentProcessor(new PayPalDepositProcess(),new PaypalDepositTransaction());
PaymentProcessor refundProcessor = new PaymentProcessor(new PayPalRefundProcess(),new PayPalRefundTransaction());

注意你的样子PaymentProcessor可以传递 a 的不同组合处理器 and 交易无需有switch陈述。

注意processor.process(transaction);听起来比更直观transaction.process(processor)。另请注意,您可以考虑使用抽象工厂此处的模式,因为您似乎正在创建一系列相关对象(处理不同类型事务的不同类型的处理器)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在OOP中设计嵌套多态性? 的相关文章

  • Microsoft 的并行模式库:有人想知道移植到 POSIX / Linux 有多困难吗?

    该书已出版 http blogs msdn com b vcblog archive 2011 03 15 10139453 aspx http blogs msdn com b vcblog archive 2011 03 15 1013
  • tkinter - 使用按钮在帧之间来回切换

    我需要功能 最好是一个功能 当按下下一页和后退按钮时可以在页面之间来回切换 我想这可以通过将布尔变量分配给后退和下一页按钮来完成 不确定是否可以这样做 来确定您是否要前进或后退所有页面的有序列表 需要知道当前升高的框架的索引 索引可用于找出
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以
  • 开闭原则背后的含义和推理是什么?

    开放 封闭原则规定软件实体 类 模块等 应该对扩展开放 但对修改关闭 这意味着什么 为什么它是良好的面向对象设计的重要原则 这意味着您应该将新代码放入新的类 模块中 现有代码应仅针对错误修复进行修改 新类可以通过继承重用现有代码 开放 封闭
  • Java - 创建对同一对象的两个引用

    检查以下代码 Object object new Object objectList add object objectListTwo add object 有什么方法可以让两个数组指向同一个对象 这样当我改变时object在一个数组中 它
  • MySQL 数据库配置在单独的类中

    是否可以在单独的类中保留所有与数据库相关的配置 主机名 用户名 密码和数据库 以及连接和选择正确数据库的功能 我尝试过这样的事情 class Database var config array username gt someuser pa
  • 需要创建一个“选择你自己的冒险”类型的指南 - 最佳使用方法

    基本上需要询问用户一系列问题并收集信息 每个问题都可能对以后的不同问题产生影响 另一个例子是涡轮税的网络界面 在某些 上回答 是 可能会引发未来的问题 似乎这在软件中是一个相当常见的问题 所以我想我是在问是否有任何现有的解决方案 设计模式可
  • 复制构造函数有什么问题?为什么要使用Cloneable接口?

    在进行 C 编程时 我们过去常常在需要时创建复制构造函数 或者我们是这么被教导的 几年前切换到 Java 时 我注意到现在正在使用 Cloneable 接口 C 遵循定义 ICloneable 接口的相同路线 在我看来 克隆是 OOP 定义
  • 微服务中的事务

    我读过一些关于微服务架构的文章 但没有人涉及事务的主题 他们都说这很难做到 也许有人可以描述如何处理这个问题 但不是从领域方面 而是从技术方面 假设我们有一个业务案例 我们需要调用两个不同的服务 并且它们都对数据库进行一些更改 但是如果第二
  • OOP:什么时候它是一个对象?

    我正在尝试理解面向对象 我当然明白一点 但有时我并不是百分百清楚 你如何决定什么应该变成一个对象 另一个大的整个对象的小对象部分 或者什么不值得成为一个对象 或者也许它应该只是那个大的整个对象的属性 对于一扇门来说 我猜门把手应该是一个独立
  • 您最好的 Swing 设计模式和技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 工厂模式数据库连接

    我正在尝试使用 MySQL 实现数据库连接上的工厂模式 SQL Server 面临奇怪的错误 你调用的对象是空的 在 SQL 命令对象上 internal class SqlServerDB IDatabase private SqlCon
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何在 Javascript 中创建类?

    这是我到目前为止所得到的 它根本不起作用 我的玩家类中的所有变量都是空的 并且更新永远不会被调用 我的意思是编程类 而不是 CSS 类 IE 不是 movi ngdiv 颜色 ff0000
  • 多态与策略模式

    两者有什么区别Strategy图案和Polymorphism在Java中 我很困惑 通过策略模式实现的任何目标基本上都可以通过多态性实现 如果我在这方面错了 请纠正我 请还提供我的例子来消除我的困惑 对我来说 链接来自CKing https
  • Java 启用实现相同接口的枚举

    我有一个小组项目 我们被迫使用提供的接口和枚举 想象一下如下情况 marker interface interface Request
  • Java 中的转换(接口和类)

    if interface I class A implements I class B extends A class C extends B A a new A B b new B Why a B I b is correct but b
  • Python:访问另一个类中一个类的属性和方法

    假设我有两个 A 类和 B 类 Class A A s attributes and methods here Class B B s attributes and methods here 现在我可以评估 B 类对象中 A 的属性 如下所
  • 在 MVC 中,视图应该知道模型吗?

    如果视图知道模型 or not 程序员经常简化这一点并使视图特定于模型 例如 如果您使用的是 CRM 应用程序 则模型可能有一个名字字段 然后 视图假定给定的模型对象有一个firstName 字段 并在适当的位置显示该字段 这当然是不可重复

随机推荐