簡體   English   中英

java 中的模板方法模式

[英]Template method pattern in java

我在 java 有任務,我需要幫助。 我試圖解決它,但我有一些無法理解的問題。

作業是:在本練習中,使用模板方法模式定義一個抽象 class 過濾器,該過濾器帶有一個調用方法 accept(鈎子方法)的公共方法過濾器(模板方法),該方法可以在不同的具體類中以不同的方式實現. 通過擴展 class 過濾器並定義接受來編寫一個測試程序,以便只接受最多三個字符的字符串。

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);
    }
}

這是我老師的評論: “不正確,過濾器 class 中只有接受方法應該是抽象的,過濾器方法應該已經在過濾器 class 中實現並且不是抽象的,所有實現都是相同的,只有接受方法發生了變化對於不同的過濾器)”。

我不明白我現在應該做什么,代碼將如何正確。 請幫忙,謝謝

我假設過濾器應該看起來像這樣

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<T>聲明為interface ,並為過濾器提供默認實現。 看看這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM