Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 通用面向对象设计模式_Oop_Design Patterns_Delegates_Notifications - Fatal编程技术网

Oop 通用面向对象设计模式

Oop 通用面向对象设计模式,oop,design-patterns,delegates,notifications,Oop,Design Patterns,Delegates,Notifications,考虑以下一般程序结构: 类A有一个类B的实例作为成员变量 类B有一个包含类C实例的集合成员变量 类A中的事件通过A简单地告诉B该事件而传播到C实例 与A类对话的C类实例相关的设计模式是什么? 一个选项是A类订阅的C类发布通知实例。另一个选项是将对a类的引用“向下传递”(从a传递到B,然后从B传递到每个C)。后一个选项允许C实例直接与A对话。如果您字面上指的是设计模式(即GoF类型),则以下是一些相关选项: 命令:将回调传递给C项(直接或间接通过B),这样,当它们想要与a进行对话时,就可以简

考虑以下一般程序结构:

  • 类A有一个类B的实例作为成员变量
  • 类B有一个包含类C实例的集合成员变量
  • 类A中的事件通过A简单地告诉B该事件而传播到C实例
与A类对话的C类实例相关的设计模式是什么?

一个选项是A类订阅的C类发布通知实例。另一个选项是将对a类的引用“向下传递”(从a传递到B,然后从B传递到每个C)。后一个选项允许C实例直接与A对话。

如果您字面上指的是设计模式(即GoF类型),则以下是一些相关选项:

  • 命令:将回调传递给
    C
    项(直接或间接通过B),这样,当它们想要与
    a
    进行对话时,就可以简单地调用此回调,甚至可以使用参数
  • 迭代器:
    B
    将其聚合集合的视图直接公开给
    a
    ;然后直接在
    A
    C
    之间进行通信
  • 中介:公开
    A
    C
    可能订阅的通知;沟通是通过发布事件来完成的
  • 观察家:你已经建议的第一个选项是什么
另一方面,如果您真正指的是架构模式,那么典型的选项是:

  • 您的第一个选项,
    A
    订阅
    C
    事件。乍一看,这似乎不是一个全面的好主意,除非事件始终非常有用,因为它需要
    n
    对象聚合一个指向回调的指针,在最坏的情况下,它们甚至可以只使用一次
  • 传递对
    A
    的引用是另一种选择,但如果您打算用方法污染
    A
    的公共接口,而
    C
    可以在非常特定的场景中调用它,那么这不是一个好的选择。如果
    A
    已经公开了一个合适的接口,那么它会非常有效,但是请注意,在
    C
    之间可能需要一个适配器类来回调
    A
    ,以避免
    C
    A
    的接口紧密耦合
  • 第三个选项是
    A
    直接迭代
    B
    提供的集合(视图),并向
    C
    实例提供回调;这样做的优点是非常松散耦合,并且使用的内存量最少,但编写代码可能有点棘手

更适合设计和概念问题。您是在寻找特定的设计模式,还是在寻找可能使用设计模式的最佳解决方案?设计模式的存在是为了解决在给定环境中频繁出现的问题。你没有指明我能看到的任何问题。