我相信這可以用註釋來完成,就像你提出的那樣。這將是一個簡單的實現,它也採用了AbstractFactory
模式:
class ThirdPartyClass {
@FormatStrategy(fmt="unsigned8",offset=0)
int memberA;
@FormatStrategy(fmt="unsigned16",offset=1)
int memberB;
@FormatStrategy(fmt="unsigned16",offset=3)
int memberC;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FormatStrategy{
String fmt() default "unsigned8";
int offset()default 0;
}
interface FormattingStrategy{
String formatNumber(int number);
}
class BasicFormattingStrategy implements FormattingStrategy{
private String fmt;
private int offset;
private BasicFormattingStrategy(String fmt, int offset) {
this.fmt = fmt;
this.offset = offset;
}
@Override
public String formatNumber(int number) {
// do formatting here
return "formatted number";
}
}
interface StrategyFactory{
FormattingStrategy getStrategy(FormatStrategy fmtStrategy);
}
class DefaultStrategyFactory implements StrategyFactory{
@Override
public FormattingStrategy getStrategy(FormatStrategy fmtStrategy) {
// right now only one strategy implementation exists, but may have many.
return new BasicFormattingStrategy(fmtStrategy.fmt(), fmtStrategy.offset());
}
}
這裏將是實際使用策略的代碼:
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException{
StrategyFactory factory = new DefaultStrategyFactory();
ThirdPartyClass obj = new ThirdPartyClass();
Class<ThirdPartyClass> clazz = (Class<ThirdPartyClass>) obj.getClass();
for(Field field : clazz.getDeclaredFields()){
FormatStrategy fmtStrategy = field.getAnnotation(FormatStrategy.class);
if(fmtStrategy != null){
FormattingStrategy strategy = factory.getStrategy(fmtStrategy);
String formattedNumber = strategy.formatNumber(field.getInt(obj));
// use the formatted number
}
}
}
顯然,你會想要做實際的異常處理/錯誤檢查。