大家好,小学生给新手分享一下JavaWeb中的多态、实现。因为楼主项目的需求,需要给其他公司抛出一个接口,让他们调用。这个接口中有一个方法,但是有不同的实现,为了不让人家看见我们的实现,所以用到了多态现实。往下看...
1、先创建一个对外的接口类,IAcctEngine,因为这里是小demo,所以就只写一个打印方法定义
package com.xzhang.controller.acctEngine;
import com.xzhang.acctEngine.OrderBizType;
import com.xzhang.model.User;
/**
* @Title: IAcctEngine.java
* @Package: com.xzhang.controller.acctEngine
* @Description: 多态继承 接口
*
********************************************************
* Date Author Changes
* 2016年11月3日 zx 创建
********************************************************
*/
public interface IAcctEngine {
/**
* 测试打印user
* 创建人:zx
* 2016年11月3日 下午5:12:29
* @param u
*/
public void printTestUser(User u,OrderBizType orderBizType) throws Exception;
}
2、再创建对外接口的实现类,AcctEngine。其中写了3个AccountingValiadator接口类(这个接口内部看到)
package com.xzhang.controller.acctEngine;
import com.xzhang.acctEngine.OrderBizType;
import com.xzhang.model.User;
public class AcctEngine implements IAcctEngine {
private AccountingValiadator paymentAccountingValiadator;
private AccountingValiadator paymentRefundAccountingValiadator;
private AccountingValiadator repaymentAccountingValiadator;
@Override
public void printTestUser(User u,OrderBizType orderBizType) throws Exception {
AccountingValiadator valiadator = null;
switch (orderBizType)
{
case Payment:
valiadator = this.paymentAccountingValiadator;
break;
case PaymentRefund:
valiadator = this.paymentRefundAccountingValiadator;
break;
case Repayment:
valiadator = this.repaymentAccountingValiadator;
break;
default:
throw new Exception("未知的交易业务类型");
}
//执行对应的方法
valiadator.validate(u, orderBizType);
}
public AccountingValiadator getPaymentAccountingValiadator() {
return paymentAccountingValiadator;
}
public void setPaymentAccountingValiadator(
AccountingValiadator paymentAccountingValiadator) {
this.paymentAccountingValiadator = paymentAccountingValiadator;
}
public AccountingValiadator getPaymentRefundAccountingValiadator() {
return paymentRefundAccountingValiadator;
}
public void setPaymentRefundAccountingValiadator(
AccountingValiadator paymentRefundAccountingValiadator) {
this.paymentRefundAccountingValiadator = paymentRefundAccountingValiadator;
}
public AccountingValiadator getRepaymentAccountingValiadator() {
return repaymentAccountingValiadator;
}
public void setRepaymentAccountingValiadator(
AccountingValiadator repaymentAccountingValiadator) {
this.repaymentAccountingValiadator = repaymentAccountingValiadator;
}
}
3、创建一个枚举类OrderBizType,主要是用来存放调用的类型
package com.xzhang.acctEngine;
/**
* 订单业务动作类型
* @author zx
*
*/
public enum OrderBizType {
Payment,//消费
Topup,//储值,对应时序方式mapping
Repayment,//还款,对应指定特定Deal方式mapping
TopupRefund, //还款后退款退款
PaymentRefund, //消费后未还款退款
Installment,//分期业务
Release, //冻结释放
InstmtOrder, //助学贷业务
InstmtRelease; //助学贷释放
}
4、创建AccountingValiadator接口,里面也是只声明了一个打印方法
package com.xzhang.controller.acctEngine;
import com.xzhang.acctEngine.OrderBizType;
import com.xzhang.model.User;
public interface AccountingValiadator {
/**
* 测试打印user
* 创建人:zx
* 2016年11月3日 下午5:12:29
* @param u
*/
public void validate(User u,OrderBizType orderBizType);
}
5、创建第一个AccountingValiadator实现类:PaymentAccountingValiadator如下:
package com.xzhang.controller.acctEngine;
import com.alibaba.fastjson.JSON;
import com.xzhang.acctEngine.OrderBizType;
import com.xzhang.model.User;
import com.xzhang.service.IUserService;
public class PaymentAccountingValiadator implements AccountingValiadator {
private IUserService userService;
@Override
public void validate(User u, OrderBizType orderBizType) {
System.out.println("PaymentAccountingValiadator打印:"+JSON.toJSONStringWithDateFormat(u,"yyyy-MM-dd HH:mm:ss"));
}
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
}
6、创建第二个AccountingValiadator接口实现类:PaymentRefundAccountingValiadator如下:
package com.xzhang.controller.acctEngine;
import com.alibaba.fastjson.JSON;
import com.xzhang.acctEngine.OrderBizType;
import com.xzhang.model.User;
import com.xzhang.service.IUserService;
public class PaymentRefundAccountingValiadator implements AccountingValiadator {
private IUserService userService;
@Override
public void validate(User u, OrderBizType orderBizType) {
System.out.println("PaymentRefundAccountingValiadator打印:"+JSON.toJSONStringWithDateFormat(u,"yyyy-MM-dd HH:mm:ss"));
}
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
}
7、创建第三个AccountingValiadator接口实现类:RepaymentAccountingValiadator如下:
package com.xzhang.controller.acctEngine;
import com.alibaba.fastjson.JSON;
import com.xzhang.acctEngine.OrderBizType;
import com.xzhang.model.User;
import com.xzhang.service.IUserService;
public class RepaymentAccountingValiadator implements AccountingValiadator {
private IUserService userService;
@Override
public void validate(User u, OrderBizType orderBizType) {
System.out.println("PaymentAccountingValiadator打印:"+JSON.toJSONStringWithDateFormat(u,"yyyy-MM-dd HH:mm:ss"));
}
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
}
8、在springmvc的配置文件中引用一个springBean声明的.xml文件:spring-tools.xml
<!-- 引入‘继承多态’的配置文件 -->
<import resource="spring-tools.xml" />
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<bean id="paymentAccountingValiadator" class="com.xzhang.controller.acctEngine.PaymentAccountingValiadator">
<property name="userService" ref="userService"/>
</bean>
<bean id="paymentRefundAccountingValiadator" class="com.xzhang.controller.acctEngine.PaymentRefundAccountingValiadator">
<property name="userService" ref="userService"/>
</bean>
<bean id="repaymentAccountingValiadator" class="com.xzhang.controller.acctEngine.RepaymentAccountingValiadator">
<property name="userService" ref="userService"/>
</bean>
<!-- 多态继承 接口 -->
<bean id="acctEngine" class="com.xzhang.controller.acctEngine.AcctEngine">
<property name="paymentAccountingValiadator" ref="paymentAccountingValiadator"/>
<property name="paymentRefundAccountingValiadator" ref="paymentRefundAccountingValiadator"/>
<property name="repaymentAccountingValiadator" ref="repaymentAccountingValiadator"/>
</bean>
</beans>
9、具体的使用方式如下:只要在调用的时候传入不同的枚举类值即可调用不同的实现类方法
package com.xzhang.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import com.alibaba.fastjson.JSON;
import com.xzhang.acctEngine.OrderBizType;
import com.xzhang.controller.acctEngine.IAcctEngine;
import com.xzhang.model.User;
import com.xzhang.model.WdServiceInfo;
import com.xzhang.service.IUserService;
@Controller
@RequestMapping("/userController")
public class UserController {
private static final Logger log = Logger.getLogger(UserController.class);
@Autowired
private IUserService userService;
@Autowired
private IAcctEngine iAcctEngine;
/*
* 动态id访问
* @RequestMapping("/showUser/{id}.do")
* showUser(@PathVariable String id, HttpServletRequest request)
* */
@RequestMapping("/showUser.do")
public String showUser(String id, HttpServletRequest request) {
User u = userService.getUserById(id);
request.setAttribute("user", u);
log.info(JSON.toJSONStringWithDateFormat(u,"yyyy-MM-dd HH:mm:ss"));
try {
if(null != iAcctEngine){
iAcctEngine.printTestUser(u, OrderBizType.Payment);
}
} catch (Exception e) {
e.printStackTrace();
}
return "user/showUser";
}
}
10、注意点:
(1)jar包一定要引用全
(2)有空在运行的时候遇到空指针错误,请检查你的bean是否注入
11、楼主的项目结构如下图:
好了,小学生能力有限,如有疑问、指正请及时提出,谢谢大家