2011-01-09 72 views
3
public class Converter 
{ 
    private Logger logger = Logger.getLogger(Converter.class); 
    public String convert(String s){ 
     if (s == null) throw new IllegalArgumentException("input can't be null"); 
     logger.debug("Input = " + s); 
     String r = s + "abc"; 
     logger.debug("Output = " + s); 
     return r; 
    } 

    public Integer convert(Integer s){ 
     if (s == null) throw new IllegalArgumentException("input can't be null"); 
     logger.debug("Input = " + s); 
     Integer r = s + 10; 
     logger.debug("Output = " + s); 
     return r; 
    } 
} 

上述2種方法非常相似,所以我想創建一個模板來做類似的事情,並將實際的工作委託給approriate類。但我也想在不改變模板的情況下輕鬆擴展此框架工作。 舉例:java模板設計

public class ConverterTemplate 
{ 
    private Logger logger = Logger.getLogger(Converter.class); 
    public Object convert(Object s){ 
     if (s == null) throw new IllegalArgumentException("input can't be null"); 
     logger.debug("Input = " + s); 
     Object r = doConverter(); 
     logger.debug("Output = " + s); 
     return r; 
    } 

    protected abstract Object doConverter(Object arg); 
} 

public class MyConverter extends ConverterTemplate 
{ 
    protected String doConverter(String str) 
    { 
     String r = str + "abc"; 
     return r; 
    } 

    protected Integer doConverter(Integer arg) 
    { 
     Integer r = arg + 10; 
     return r; 
    } 
} 

但是,這並不行。任何人都可以建議我一個更好的方法來做到這一點?我想實現兩個目標: 1.一個可擴展的模板,爲我做所有類似的工作。 2.我最大限度地減少擴展類的數量。

謝謝,

+2

看看[泛型]( http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf)。 – 2011-01-09 22:51:51

回答

5

使用仿製藥,使轉換方法最終(所以它不是重寫時,你想保持這個模板),並在不同的類中的每個類型轉換器的實現:

public interface Converter<T> { 

    public T convert(T s); 
} 


public abstract class AbstractConverter<T> implements Converter<T> { 

    @Override 
    public final T convert(T s) { 
     if (s == null) throw new IllegalArgumentException("input can't be null"); 
     //logger.debug("Input = " + s); 
     T r = doConverter(s); 
     //logger.debug("Output = " + s); 
     return r; 
    } 

    public abstract T doConverter(T s); 
} 


public class StringConverter extends AbstractConverter<String> { 

    public String doConverter(String s) { 
     String r = s + "abc"; 
     return r; 
    }; 
} 

public class IntegerConverter extends AbstractConverter<Integer> { 

    public Integer doConverter(Integer s) { 
     Integer r = s + 10; 
     return r; 
    }; 
} 
+1

此接口等同於Function,http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Function.html。這在函數中也有有用的實用方法,http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Functions.html。 – sjr 2011-01-09 23:23:11

1

這是一個使用泛型的完美案例。更具體地說,你可以指定父類有一個「通用」類,它用於doConvert。然後,擴展將分別指定它們正在使用的類的類型。