【问题标题】:Template design pattern in JDK, could not find a method defining set of methods to be executed in orderJDK中的模板设计模式,找不到定义要按顺序执行的方法集的方法
【发布时间】:2016-02-22 16:55:38
【问题描述】:

我正在阅读有关Template design pattern 的信息。根据我目前的理解,当我们有一个具有定义的过程(方法)集的算法要按顺序完成时,可以使用模板设计模式。 主要参与者是

1.Abstract Template class 提供template method 定义流程(方法)和执行顺序。通常这个方法是最终的,所以它的行为不会被修改。模板方法中提到的进程(方法)很少有默认实现,其他依赖于扩展抽象模板类类型的具体类保留为抽象。

2.Concrete classes extending the Template method。如有必要,它们会覆盖默认方法,并为抽象模板类中定义的抽象方法提供实现。

我尝试在 JDK 中搜索它的实现,在阅读了这些类实现了这种模式后,我查看了 java.io 类。我找不到任何定义一组流程(方法)和执行顺序的方法。

请提供您宝贵的意见。

【问题讨论】:

  • 恐怕我没有完全理解...您想要JDK中模板设计模式的示例,还是想要一种可以让您实现的语言的实用程序类你自己的类的模板模式?在后一种情况下,没有这样的实用程序,因此您必须实现模拟模板模式的类。
  • @FedericoPeraltaSchaffner,我知道没有实用程序类或方法来实现设计模式,我想要 JDK 中的模板模式示例。

标签: java design-patterns jdk1.5 template-method-pattern


【解决方案1】:

一个简单的例子是java.io.OutputStream

template method
public void write(byte b[], int off, int len)

它调用抽象方法
public abstract void write(int b),
必须由OutputStream 的子类实现。

在这种情况下,模板的不变部分是每个OutputStream 通用的基本错误处理,而模板的变体部分是实际编写,具体针对每个具体实现。

你对模式的理解是正确的;但是,它不必那么复杂。基本上,任何在同一个类中调用抽象方法的具体方法都是模板方法。

【讨论】:

  • 感谢您的回答。看了你的回答后,我又想到了一点。如果抽象类调用任何抽象方法(或具有默认实现的非抽象方法,可能会被覆盖,可能不会被子类覆盖)是否是模板设计模式的示例。抽象类确实有共同的行为,任何调用其中定义的方法的方法都是模板设计模式的一个例子,如果我错了,请纠正我的理解。谢谢:)
  • 不,在抽象类中调用另一个具体方法的具体方法不是模板。模板的变体部分,即被调用的方法,根据模式是抽象的。
【解决方案2】:

更具体一点:

在其实现中调用抽象方法的非抽象方法可以归类为模板方法。

Template_method 在操作中定义算法的程序骨架,将一些步骤推迟到子类。如果将完整的操作定义为抽象方法,子类将完全控制更改算法的骨架,因此抽象方法不属于模板方法。

例如Reader IO 中的类。

 public int read() throws IOException {
        char cb[] = new char[1];
        if (read(cb, 0, 1) == -1) // this is an abstract method
            return -1;
        else
            return cb[0];
    }

这里

abstract public int read(char cbuf[], int off, int len) throws IOException; 是抽象方法。

这个方法的实现可以参考BufferedReader

public int read(char cbuf[], int off, int len) throws IOException {

}

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多