封装,包装的使用
1.通用对象PriceRequest
public class PriceRequest {
protected String regionId;
protected int count;
protected String pinAlias;
protected ApplyType applyType;
public ApplyType getApplyType() {
return applyType;
}
public void setApplyType(ApplyType applyType) {
this.applyType = applyType;
}
public String getPinAlias() {
return pinAlias;
}
public void setPinAlias(String pinAlias) {
this.pinAlias = pinAlias;
}
public String getRegionId() {
return regionId;
}
public void setRegionId(String regionId) {
this.regionId = regionId;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
2.接口CalculateTotalPrice 加泛型,功能是获取不同产品的价格,产品有redis,pod
public interface CalculateTotalPrice<T extends PriceRequest> {
Number calculate(T info);
}
3.依赖redis的对象
public class RedisPriceRequest extends PriceRequest {
private String instanceType;
public String getInstanceType() {
return instanceType;
}
public void setInstanceType(String instanceType) {
this.instanceType = instanceType;
}
}
4.接口实现类
public class RedisCalculatePrice extends AbstractPrice implements CalculateTotalPrice<RedisPriceRequest> {
private static final Logger logger = LoggerFactory.getLogger(RedisCalculatePrice.class);
private static final String SERVICE_CODE = "redis";
private final BillingClientHolder clientHolder;
public RedisCalculatePrice() {
this.clientHolder = BeanContext.getBean(BillingClientHolder.class);
}
@Override
public Number calculate(RedisPriceRequest info) {
FamaPin pin = getPin(info.getPinAlias());
CalculateTotalPriceRequest request = buildParam(info);
CalculateTotalPriceResponse response = null;
try {
response = clientHolder.getClientByPin(pin).calculateTotalPrice(request);
if (null == response.getResult()) {
logger.error("get price has error :{}", response.getError().getMessage());
return 0;
}
return response.getResult().getDiscountedTotalPrice();
} catch (Exception ex) {
logger.warn("query billing from jcloud failed", ex);
logger.warn("request is {}, respond is {}", JsonUtils.toJSONString(request), JsonUtils.toJSONString(response));
return 0;
}
}
}
5.实现类的再次封装
public class PriceServiceControl<T extends PriceRequest> {
private final CalculateTotalPrice<T> price;
public PriceServiceControl(CalculateTotalPrice<T> price) {
this.price = price;
}
public Number calculate(T couponInfo) {
return price.calculate(couponInfo);
}
}
6.最终代码调用
PriceServiceControl<RedisPriceRequest> redisControl = new PriceServiceControl<>(new RedisCalculatePrice());
price = redisControl.calculate(redisPriceRequest);
原创:做时间的朋友
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示