java - 需要帮助识别此代码中使用的 'override method' 模式

标签 java oop design-patterns software-design

<分区>

以下是我正在进行的项目的简化。

我们有 Talker niceTalker“早上好!我叫乔”。 然后我们有一个精神 split 症 rudeTalker,他说“他是我”

我花了一段时间才理解代码的作用。 对我来说,这似乎是一种覆盖 Talkertalk() 方法的非常复杂的方法。 此外,TalkModifierCommand pattern 中用作命令(未显示)。

为什么要采用这种方式,而不是说通过继承实现多态呢?这是已知模式吗?

public interface Talker {
    String getName();
    void talk();
}

-

public interface TalkModifier {
    public Talker modify(Talker talker);
}

-

class NiceGuy implements Talker {
    @Override
    public void talk() {
        System.out.println("Good morning! My name is " + getName() +".");
    }
    @Override
    public String getName() {
        return "Joe";
    }
}

public class Application {

    public static void main(String[] args) {
        Talker niceTalker = new NiceGuy();

        TalkModifier rudeTalker = new TalkModifier() {
            public Talker modify(final Talker talker) {
                return new Talker() {
                    @Override
                    public void talk() {
                        System.out.println("He is me.");
                    }
                    @Override
                    public String getName() {
                        return talker.getName();
                    }
                };
            }
        };

        niceTalker.talk();
        System.out.println();
        rudeTalker.modify(niceTalker).talk();   
    }
}

最佳答案

这是两种模式的组合:

  • Delegation pattern - 此模式由在 TalkModifiermodify 方法中创建的类实现,并且
  • Factory method pattern - 该模式由TalkModifier匿名实现(TalkModifier本质上是一个工厂接口(interface))

略有不同的是,这两种模式都是使用匿名类实现的,一个匿名类的方法生成另一个匿名类的对象。

关于java - 需要帮助识别此代码中使用的 'override method' 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34230134/

相关文章:

javascript - 如何从函数/实异常(exception)部访问变量

asp.net-mvc - 使用 LINQ2SQL 限制对特定字段的更改时的最佳实践

java - Selenium Grid并行测试时如何让hub决定执行哪个节点?

java - 如何读取 tagx/jspx 中的系统属性?

java - 如何在不使用 Java 集合框架的情况下在 Java 中组合(追加)通用列表?

java - 在 Mac OSX Sierra 上安装 Ortus Commandbox,运行 box 会导致错误和异常

oop - 单一职责原则的一个例子是什么?

php - 实例化对象列表的正确方法

c# - 如何在 C# 中创建一个完美的 Singleton 类?

java - 如何在向另一个应用程序发送数据时实现重试策略?