JavaWeb接口的多态现实

大家好,小学生给新手分享一下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" />


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、楼主的项目结构如下图:





好了,小学生能力有限,如有疑问、指正请及时提出,谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值