【问题标题】:Template method pattern in javajava中的模板方法模式
【发布时间】:2019-10-31 16:41:38
【问题描述】:

我在java中有作业,我需要帮助。 我试图解决它,但我有一些无法理解的问题。

作业是: 在本练习中,使用模板方法模式定义一个抽象类过滤器,该类过滤器带有一个公共方法过滤器(模板方法),该过滤器调用方法接受(钩子方法),可以在不同的具体类中以不同的方式实现。通过扩展类Filter并定义accept来编写一个测试程序,以便只接受最多三个字符的字符串。

public abstract class Filter<T> {
    public abstract T[] filter(T[] list);

    public abstract boolean accept(T val);
}

public class FilterTest<T> extends Filter<T> {
    private int capacity = 0;

    public FilterTest(int cap) {
        this.capacity = cap;
    }

    @Override
    public T[] filter(T[] list1) {
        @SuppressWarnings("unchecked")
        T[] finalList = (T[]) Array.newInstance(list1.getClass().getComponentType(), capacity);

        int counter = 0;

        for (T t : list1) {
            if (accept(t)) {
                finalList[counter] = t;
                counter++;
            }
        }

        return finalList;
    }

    public void printArray(T[] list2) {
        for (int i = 0; i < list2.length; i++) {
            if (list2[i] != null) {
                System.out.print(list2[i] + " ");
            }
        }

        System.out.println();
    }

    @Override
    public boolean accept(T val) {
        return String.valueOf(val).length() > 0 && 
            String.valueOf(val).length() <= 3;
    }

    public static void main(String[] args) {
        FilterTest<String> filterTest = new FilterTest<>(8);

        String[] lists = { 
            "Hi", "here", "is", "the", "AOOP", "course", "at", "University" 
        };

        System.out.print("My original list is: ");
        filterTest.printArray(lists);

        System.out.print(" The filtered list is: ");
        String[] filteredList = filterTest.filter(lists);
        filterTest.printArray(filteredList);
    }
}

这是我老师的评论: “不正确,过滤器类中只有accept方法应该是抽象的,过滤器方法应该已经在Filter类中实现了而不是抽象的所有实现都是一样的,只有accept方法会因不同的过滤器而变化)”。

我不明白我现在应该做什么,代码如何正确。 请帮忙, 谢谢

【问题讨论】:

  • 看Predicate界面,和你的赋值很像。
  • 我的老师要的是abstract而不是interface,你知道吗

标签: java templates design-patterns


【解决方案1】:

我假设过滤器应该看起来像这样

public abstract class Filter<T> {

    public T[] filter(T[] list1) {
        @SuppressWarnings("unchecked")
        T[] finalList = (T[]) Array.newInstance(list1.getClass().getComponentType(), capacity);

        int counter = 0;

        for (T t : list1) {
            if (accept(t)) {
                finalList[counter] = t;
                counter++;
            }
        }

        return finalList;
    }

    public abstract boolean accept(T val);
}

您甚至可以将Filter&lt;T&gt; 声明为interface,并为过滤器提供默认实现。看看here

【讨论】:

  • 你没有改变任何东西,你能解释一下你做了什么吗
  • 请看的更准确,filter的方法定义被移到了类Filter中,而不是在实现中。这就是模板方法设计模式的重点。
  • 哦,谢谢,容量变量呢?
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 2015-09-16
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多