zoukankan      html  css  js  c++  java
  • 封装,包装的使用

    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);
    
  • 相关阅读:
    iptables详解
    Linux文件结构及基本文件夹
    linux的一些常用命令
    Sql Server REPLACE函数的使用
    MSSQL复制表操作
    MSSQL2005数据库显示单一用户模式,无法进行任何操作
    linux下查看所有用户及所有用户组
    SpringMVC基础-10-拦截器
    SpringMVC基础-09-文件上传(单文件、多文件上传)
    SpringMVC基础-08-数据转换 & 数据格式化 & 数据校验
  • 原文地址:https://www.cnblogs.com/PythonOrg/p/14756435.html
Copyright © 2011-2022 走看看