当前位置: 首页 > news >正文

富阳网站建设公司装修公司报价

富阳网站建设公司,装修公司报价,wordpress apache配置,如何建立网站的快捷方式摘要 最近阅读《贯彻设计模式》这本书#xff0c;里面使用一个更真实的项目来介绍设计模式的使用#xff0c;相较于其它那些只会以披萨、厨师为例的设计模式书籍是有些进步。但这书有时候为了使用设计模式而强行朝着对应的 UML 图来设计类结构#xff0c;并且对设计理念缺少…摘要 最近阅读《贯彻设计模式》这本书里面使用一个更真实的项目来介绍设计模式的使用相较于其它那些只会以披萨、厨师为例的设计模式书籍是有些进步。但这书有时候为了使用设计模式而强行朝着对应的 UML 图来设计类结构并且对设计理念缺少讲解所以也不能说有多优秀79分的水平。 书中就这部分内容设计提到使用了策略模式、门面模式、策略工厂模式、享元模式。但可能真正称得上是设计的内容就两个部分策略模式和策略工厂模式。但是就书中所写的策略工厂个人认为有些啰嗦并且指定全类名通过反射来获取对象这种实现不够优雅。个人相信的设计理念就是在实现代码可扩展的前提下尽可能使用少的类只开放必要的接口。虽然 Spring 获取 Bean 本质上也是通过反射来创建的效率并没有提高。但本文设计并不依赖具体框架基于 Spring 的目的也是和该书一样为了让案例更接近现实基于 Spring 既是一种便利也是一种约束。 本文的设计方案大体总结如下 具体的支付策略实现类支付宝支付、微信支付和支付策略门面Facade共同实现支付接口通过枚举类定义支付策略并实现编号到实现类的映射。由于实现类是交给 Spring 管理所以只需要实现编号到 beanName 的映射在 Facade 中使用 Map 来实现从编号到实现类对象的映射根据 Bean 的生命周期在初始化过程中为 Map 赋值。之所以使用 PostConstruct 注解是为了让 init 方法作为 private 方法而 Facade 只需要暴露上层服务真正需要调用的接口方法就行。 基础环境 pom 依赖 dependencygroupIdcom.alipay.sdk/groupIdartifactIdalipay-sdk-java/artifactIdversion4.34.0.ALL/version /dependency dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.30/version /dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion2.7.4/version /dependency dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdversion2.7.4/version /dependency常量工具类 /*** 根据阿里开放平台给出的文档字段为为第三方平台要求*/ public class AliPayConstant {public static final String OUT_TRADE_NO out_trade_no;public static final String TOTAL_AMOUNT total_amount;public static final String SUBJECT subject;public static final String PRODUCT_CODE product_code;public static final String FAST_INSTANT_TRADE_PAY FAST_INSTANT_TRADE_PAY; }实体类 Data NoArgsConstructor AllArgsConstructor Accessors(chain true) ToString(callSuper true) EqualsAndHashCode Builder public class Order {/*** 订单编号*/private String orderNo;/*** 订单金额*/private Double payment;/*** 订单标题*/private String orderTitle; }Spring 配置文件、配置属性类和配置类 payout:alibaba:# 沙箱环境的支付宝网关接口url: https://openapi-sandbox.dl.alipaydev.com/gateway.doapp-id:private-key:alipay-public-key:ConfigurationProperties(payout.alibaba) Data public class AlipayProperties {private String url;private String appId;private String privateKey;private String alipayPublicKey;// 默认值private String format json;private String charset UTF-8;private String signType RSA2; }Configuration EnableConfigurationProperties(AlipayProperties.class) public class AlipayConfiguration {Beanpublic AlipayClient alipayClient(AlipayProperties alipayProperties) throws AlipayApiException {AlipayConfig alipayConfig new AlipayConfig();//设置网关地址alipayConfig.setServerUrl(alipayProperties.getUrl());//设置应用IDalipayConfig.setAppId(alipayProperties.getAppId());//设置应用私钥alipayConfig.setPrivateKey(alipayProperties.getPrivateKey());//设置请求格式固定值jsonalipayConfig.setFormat(alipayProperties.getFormat());//设置字符集alipayConfig.setCharset(alipayProperties.getCharset());//设置签名类型alipayConfig.setSignType(alipayProperties.getSignType());//设置支付宝公钥alipayConfig.setAlipayPublicKey(alipayProperties.getAlipayPublicKey());//实例化客户端return new DefaultAlipayClient(alipayConfig);}}Controller 层 /*** 支付接口由于要回显html页面因此直接使用Controller接口*/ Controller RequestMapping(/payout) Slf4j public class PayoutController {Autowiredprivate PayoutService payoutService;SneakyThrowsGetMapping(/{payType})public void payout(HttpServletResponse response,PathVariable Integer payType) {log.info(支付方式{}, payType);Order order Order.builder().orderNo(UUID.randomUUID().toString()).payment(900.0).orderTitle(兰博基尼).build();String payPageForm payoutService.pay(order, payType);response.setContentType(text/html;charsetutf-8);PrintWriter out response.getWriter();out.write(payPageForm);out.flush();out.close();log.info(显示支付页面);}SneakyThrowsGetMapping(/callback)public void callback(HttpServletResponse response) {log.info(回调页面);PrintWriter out response.getWriter();out.write(Hello World);out.flush();out.close();log.info(写出消息);} }Service 层 Service public class PayoutService {Autowiredprivate PayStrategyFacade payStrategyFacade;public String pay(Order order, Integer payType) {return payStrategyFacade.pay(order, payType);} }设计模式部分 策略接口 public interface PayStrategy {/*** 调用第三方支付接口** param order 订单封装* return 调用成功返回页面信息即response.getBody();调用失败返回null*/String pay(Order order); }策略实现类支付宝支付、微信支付、银行支付等 复制支付宝、微信等开放平台的代码内容即可 Component(aliPay) public class AliPayStrategyImpl implements PayStrategy {Autowiredprivate AlipayClient alipayClient;Overridepublic String pay(Order order) {// 支付金额double payAmount order.getPayment();// 订单标题String orderTitle order.getOrderTitle();// 商户订单号String orderNo order.getOrderNo();// 不同的请求类型构造不同的Request对象AlipayTradePagePayRequest request new AlipayTradePagePayRequest();request.setNotifyUrl();request.setReturnUrl(http://localhost:8080/payout/callback);JSONObject bizContent new JSONObject();// 必传参数// 商户订单号商家自定义保持唯一性bizContent.put(AliPayConstant.OUT_TRADE_NO, orderNo);// 支付金额最小值0 .01 元bizContent.put(AliPayConstant.TOTAL_AMOUNT, payAmount);// 订单标题不可使用特殊符号bizContent.put(AliPayConstant.SUBJECT, orderTitle);// 电脑网站支付场景固定传值FAST_INSTANT_TRADE_PAYbizContent.put(AliPayConstant.PRODUCT_CODE, AliPayConstant.FAST_INSTANT_TRADE_PAY);request.setBizContent(bizContent.toString());AlipayTradePagePayResponse response;try {response alipayClient.pageExecute(request);} catch (AlipayApiException e) {throw new RuntimeException(e);}if (response.isSuccess()) {// 在网站上显示支付宝支付页面让用户扫描支付return response.getBody();}return null;} }策略枚举类 枚举所有的策略由于枚举类对象是静态对象因此不能够将其直接作为 Spring 容器的 Bean。 最开始枚举类中设计的两个字段分别是 int 类型的 payType 和 PayStrategy 类型的对象希望通过 ALIBABA(0, new AliPayStrategyImpl()) 的方式来初始化枚举类对象。但是由于 AliPayStrategyImpl 中的 AliClient 是交给了 Spring 容器进行管理而使用 new 方式得到的对象没有经过 Spring所以其中的 AliClient 为 null。 同时即使将枚举类交给 Spring 管理其依赖注入也十分麻烦通过初始化方法去覆盖类对象中的属性也需要依赖 beanName且设计丑陋没有枚举类的优雅。因此直接在枚举类中负责管理 beanName**在 Spring 框架中管理了 beanName就是管理了 BeanDefinition** Getter public enum PayStrategyEnum {// TODO: 由于实现类依赖了Spring的自动注入来获取AliClient, 因此直接new AlipayStrategyImpl()不会自动注入AliClientALIBABA(0, aliPay),WECHAT(1, wechatPay),;private final int payType;/*** 枚举类结合Spring的中介产物根据迪米特法则不需要对外开放*/private final String beanName;PayStrategyEnum(Integer payType, String beanName) {this.payType payType;this.beanName beanName;} }策略门面策略上下文策略工厂 Component public class PayStrategyFacade {Autowiredprivate ApplicationContext applicationContext;// 由于只在初始化的时候进行设置并发读不存在线程安全问题因此不需要使用ConcurrentHashMapprivate static final MapInteger, PayStrategy PAY_STRATEGIES new HashMap(PayStrategyEnum.values().length);PostConstructprivate void init() {// 初始化策略for (PayStrategyEnum payStrategyEnum : PayStrategyEnum.values()) {PAY_STRATEGIES.put(payStrategyEnum.getPayType(),applicationContext.getBean(payStrategyEnum.getBeanName(), PayStrategy.class));}}public String pay(Order order, Integer payType) {PayStrategy payStrategy PAY_STRATEGIES.getOrDefault(payType, null);if (payStrategy null) {throw new RuntimeException(不支持的支付类型);}return payStrategy.pay(order);} }
http://www.hkea.cn/news/14363452/

相关文章:

  • 中国住建厅网站官网wordpress iis10
  • 池州城乡住房建设厅网站网站服务器租用价格一般多少钱?
  • 深圳网站seo推广麻辣烫配方教授网站怎么做
  • 网站建设技术哪个好wordpress调用js函数
  • 南京专业做网站怎样做支付网站
  • 发布文章后马上更新网站主页pc端网站建设价格明细表
  • 庆阳网站网站建设房屋装修在线设计网站
  • 招商网站设计xxx网站建设策划书范文
  • 克拉玛依建设局网站6wordpress菜单字变小
  • 北京cms建站模板南昌网站开发多少钱
  • 旅游网站wordpress深圳网络营销全网推广
  • 做网站要找什么公司深圳全网营销推广平台
  • 机械网站怎么做重庆市建设工程信息网打不开是怎么回事
  • 触摸屏网站建设iis网站管理助手
  • wap版网站 加app提示wordpress 多主题共存
  • 博客发布 网站模版网站网页区别
  • 网站开发用怎么语言佛山 网站开发
  • 网站产品推广制作临沂企业建站模板
  • 开发网站建设的问卷调查wordpress同步到微博
  • 二级单位网站建设广州微信网站建设价格
  • 做公司网站的服务费入什么费用怎么制作链接
  • 百度建网站网站开发需求表
  • 西安网站建设首选那家洛阳网站改版维护公司
  • 腾讯网站建设专家中国对外贸易网站
  • 宣传型电子商务网站林州网站建设
  • 安岳网站建设免费小程序制作软件
  • 廊坊建设公司网站wordpress gallery
  • 湖州 外贸网站建设加盟创业商机网
  • 网站地图分析工具app推广在哪里可以接单
  • 即墨网站建设哪家好外贸公司手机网站