контроллер 1. Заказы, расчет на основе цен на сырьевые товары скидка товаров ID ID банковские каналы и интерфейсы:
Импорт org.springframework.web.bind.annotation.GetMapping; Импорт org.springframework.web.bind.annotation.RequestMapping; Импорт org.springframework.web.bind.annotation.ResponseBody; Импорт org.springframework.web.bind.annotation. RestController; Импорт java.math.BigDecimal; @RestController @ RequestMapping ( "/ Приказ" ) общественный класс {OrderController / ** сумма * после скидка рассчитываются в соответствии с идентификатором товарных и банковские каналы ид * * @param goodsId ID продукта * @param channelId канал банк выше идентификатор * @return * / @GetMapping ( "/ известково" ) @ResponseBody общественности Строка calcAmount (Integer goodsId, Integer channelId) { контекст Context = новый контекст (); BigDecimal BigDecimal; попробовать { BigDecimal = context.calRecharge (goodsId, channelId); } Задвижка (Исключение е) { e.printStackTrace (); вернуться «» ; } Вернуть bigDecimal.setScale (2) + " " ; } }
2. Контекст:
Импорт java.math.BigDecimal, общественный класс {Context / ** Сумма * после скидки рассчитывается в соответствии с идентификатором товарные и банковские каналы ид * * @param goodsId ID продукта * @param channelId банковские каналы идентификатор * @return * @throws Exception * / общественного BigDecimal calRecharge (goodsId Integer, Integer channelId есть) бросает исключение { strategyFactory strategyFactory = StrategyFactory.getInstance (); // запрос идентификатор канала конкретный класс реализации банка Стратегия Стратегия = strategyFactory.create (channelId есть); // позвонить в определенной категории рассчитывается возврат strategy.calRecharge (goodsId, channelId есть); } }
Пример 3. Дисконтная блок вычисления фабрики класса, внутренняя реализация класса с отображением между банком каналов для хранения карты и конкретного банка ид, банк для облегчения доступа к соответствующему каналу в соответствии с определенным отражением категории ID:
импорт org.reflections.Reflections; импорт java.util.HashMap; импорт java.util.Set; общественный класс StrategyFactory { частный статический StrategyFactory strategyFactory = новый StrategyFactory (); частный StrategyFactory () { } общественного статического StrategyFactory деЫпзЬапс () { вернуться strategyFactory; } Частный статический HashMap <Integer, String> source_map = новый HashMap <> (); статические { Отражения отражений = новыйРазмышления ( "ICBCBankImpl" ); Набор <класс <>> classSet = reflections.getTypesAnnotatedWith (Платежной.? Класс ); для (класс <>? Clazz: classSet) { Платят Платят = clazz.getAnnotation (. ОПЛАТА класс ); source_map. PUT (pay.channelId (), clazz.getCanonicalName ()); } } / ** * получить конкретный банк класса реализации банковские каналы из карт ID * * @param channelId является * @return * @throws Exception * / общественной стратегии Создать ( INT channelId)бросает исключение { Строка clazz = source_map.get (channelId); Класс clazz_ = <?> Class.forName (clazz); вернуться (Стратегия) clazz_.newInstance (); } }
4. После расчета дисконтной цены интерфейса:
импорт java.math.BigDecimal; публичный интерфейс Стратегия { BigDecimal calRecharge (Integer goodsId, Integer channelId); }
5. ICBC класса реализации, класс заметка на плюс @Pay идентификатора канала указывается ICBC соответствующей базы данных:
Импорт javax.annotation.Resource; Импорт java.math.BigDecimal; / ** * Коммерческий банк класс реализации, базы данных идентификатор канала , соответствующий 1. * / @Pay (channelId есть = 1. ) Общественный класс ICBCBankImpl инвентарь Стратегия { @Resource Private goodsMapper goodsMapper; @Resource Private channelMapper channelMapper; / ** * цена после скидки рассчитывается в зависимости от товара и банковские каналы ид ид * * @param goodsId продукт ID * @param channelId банковских каналов ID * @return * / @Override общественногоBigDecimal calRecharge (целое число goodsId, Целое channelId) { BigDecimal goodsPrice = goodsMapper.getGoodsPriceById (goodsId); BigDecimal discountPrice = channelMapper.getDiscountPriceById (channelId); если (goodsPrice == NULL || discountPrice == NULL ) { возвращение нуль ; } Вернуть goodsPrice.multiply (discountPrice); } }
6. Банк знак для аннотирования класса реализации определяет атрибут банковских каналов ID:
импорт java.lang.annotation.ElementType; импорт java.lang.annotation.Retention; импорт java.lang.annotation.RetentionPolicy; импорт java.lang.annotation.Target; @Target (ElementType.TYPE) @Retention (RetentionPolicy.RUNTIME) общественного @ интерфейс Pay { INT channelId (); }
7. проверка моделирования цены Dao:
импорт java.math.BigDecimal; общественный класс GoodsMapper { общественного BigDecimal getGoodsPriceById (Integer goodsId) { вернуться BigDecimal.valueOf (599 ); } }
8. Аналоговый запрос канала запроса скидка Dao:
импорт java.math.BigDecimal; общественный класс ChannelMapper { общественного BigDecimal getDiscountPriceById (Integer channelId) { вернуться BigDecimal.valueOf (0,5 ); } }