Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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

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
Java 什么设计模式适合我的场景_Java_Oop - Fatal编程技术网

Java 什么设计模式适合我的场景

Java 什么设计模式适合我的场景,java,oop,Java,Oop,我有两个班——A班和B班 类A接收来自上层的消息,我想将此消息转发给类B进行处理。当B处理此消息时,它将更新自己的状态并生成一些事件。类A中有一个方法可以将这些事件发送到上层 我无法更改类A中的sendEventToUpperLayer()。那么如何将类B中生成的事件及其状态返回给类A?我是否应该放弃类B,将类B的逻辑移到类A中 public class A { private B b; private void processMessage(Message) {

我有两个班——A班和B班

类A接收来自上层的消息,我想将此消息转发给类B进行处理。当B处理此消息时,它将更新自己的状态并生成一些事件。类A中有一个方法可以将这些事件发送到上层

我无法更改类A中的sendEventToUpperLayer()。那么如何将类B中生成的事件及其状态返回给类A?我是否应该放弃类B,将类B的逻辑移到类A中

public class A {
    private B b;
    private void processMessage(Message) {
        b.processMessage(Message);
    }

    private void sendEventToUpperLayer() {
    }
}

public class B {
    public void processMessage(Message) {
        // It will generate a few events and update b's state.
        // All these events and b's state will need to use class A's method of sendEventToUpperLayer() to forward to upper layer.
    }
}

class A
实现一个用于发送消息的接口,该接口声明sendEventToUpperLayer或更通用的命名版本(然后实现将其委托给现有的sendEventToUpperLayer方法)

然后将
class A
作为参数传递给
class B
processMessage
方法,class B接受该方法作为命名接口(而不是直接作为class A)

然后,类B可以根据需要多次调用类A的必要方法,因为它是一个接口,不需要直接调用类A,并且可以进行适当的单元测试等


如果合适,您还可以将类A(通过前面提到的接口)传递给类B的构造函数中的类B,前提是类B实例在回调时总是引用同一个类A实例。

老实说,您不清楚要做什么。我可以冒昧提个建议,看看谢谢你。事实上,观察者模式是我脑海中第一个出现的模式。但观察者模式只涉及可观察的通知观察者。在我的例子中,我认为我的A类是可观察性的,B类作为观测器,因为A类将通过使用B. PurrimeMeb(消息)通知B类。但我的问题是类B如何使用类A的方法,即反向通知?您也可以尝试使用委托,将lambda、方法或对象传递给包含的
B
A,用于回调容器
A
。感谢freedev,实际上我可能会回调容器A几次,因为在B类处理消息时会生成一些事件。所以我想通过使用B.process(消息,class A'instance)将class A的实例传递给class B的实例。谢谢Trevor。你建议的方法比我想的通过类A的实例要好得多。事实上,我也在考虑第二种解决方案,放弃B类,将B类的逻辑移到a类。那么,您如何建议这两种解决方案的利弊呢?@Lazysheep.wang取决于类之间的耦合程度。如果类B永远不会存在于类a之外,那么您可以组合它们的逻辑,或者将类B实现为类a的内部类。但是一般来说,如果您将逻辑适当地拆分为单独的类,它通常会感觉更干净,即使您必须将类A传递给类B。这实际上取决于特定情况的详细信息(例如,类B是否有数据/状态,或者是否只有方法等)。