gpt4 book ai didi

java - 'Strategy pattern'可以用Java注解实现吗?

转载 作者:行者123 更新时间:2023-11-30 06:31:52 27 4
gpt4 key购买 nike

我想使用 Strategy Pattern为第三方类中的成员实现一些定制的格式化行为。我希望第三方只需注释类成员以指示他们是否应该使用格式策略(A、B 或 C),然后使用他们类的实例调用我的“格式”函数。然后,我的格式化函数应使用注释来识别需要格式化的成员以及我要使用的格式化策略。

public class ThirdPartyClass
{
@FormatStrategy(fmt=unsigned8,offset=0)
int memberA;

@FormatStrategy(fmt=unsigned16,offset=1)
int memberB;

@FormatStrategy(fmt=unsigned16,offset=3)
int memberB;
}

在一个完美的世界中,我希望 Java 注释同时支持继承和方法,但事实似乎并非如此。所以我的问题是,在没有任何一个的情况下,实现它的好方法是什么,同时仍然只用注释接触第三方类?

问候

最佳答案

我相信这可以通过注释来完成,正如您所建议的那样。这将是一个示例实现,它还使用 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
}
}
}

显然,您需要进行实际的异常处理/错误检查。

关于java - 'Strategy pattern'可以用Java注解实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9365049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com