容器(Context)使用之支付系统

1. 背景

可能提起容器,大家第一感觉想到的就是Java实用类库中的List、Set、Queue和Map等类型。在《Thinkin java》一书中有这样的说法,这些对象类型也称为集合类,但由于Java的类库中使用了Collection这个名字来指代该类库的一些特殊子集,所以我们使用了更广的术语“容器”称呼它们。而在技术有这样的说法,现在中容器的时代。我个人是持有赞同态度的。比如,现在我们开发的缓存技术,不就是用到容器的思想吗?所以,根据笔者在某家知名公司接触的系统来谈谈Context。可能读者会觉得迷惑,不是讲容器吗?怎么说到Context了。至于为什么?就带着这样的迷惑进入文章。(源码:链接:http://pan.baidu.com/s/1mhHrykC 密码:h6b2)

2. 例子说明

现在我们要实现一个支付的例子。这个例子是这样的,用户要使用我们的系统时,首先要先登录,登录的信息首先要经过接口(AccessGateway),对用户的输入的信息先做筛选判断,保证没有输入不规范的信息,只有确认用户没故意破坏我们的系统情况下,接口可以将信息进行封装好了之后,将信息传送给处理用户的类(IndetityCenter)进行处理,这里需要这个类查找数据库,然后判断用户的信息是否存在。我们就假设存在,那么IndetityCenter需要返回信息,提示可以进行下一步的操作,就是交易类(TransactionCenter)处理。可是还是要用户输入他要进行的业务,业务有:存款、取款、贷款。用户选择好要进行的业务之后,还是要AccessGateway告诉TransactionCenter去处理。最后处理的结果怎样,TransactionCenter要告诉AccessGateway,由AccessGateway去通知用户,这一步可能在例子中没有实现。

3. 例子时序图

容器(Context)使用之支付系统_第1张图片

4. 实现详解

4.1用户登录

1)        用户登录,我们这里实现可能比较简单,只是需要输入用户名和密码就行了。同时,我们这里并没有用户数据库,中是指定个用户owen,密码123就可以了。在实际中,肯定要建表来做的。下面是登录图。

容器(Context)使用之支付系统_第2张图片

2)        需要输入用户名和密码的代码如下所示。

scan = new Scanner(System.in);
		     System.out.print("请输入您的姓名:");
		     username = scan.next();
		     System.out.print("请输入您的密码:");
		     password = scan.next();
		     Customer customer = new Customer(username,password);
		     
		     AccessGateway.doService(context, "IC", customer);

3)        可能细心的读者已经注意到了这一行代码:AccessGateway.doService(context, "IC", customer),最后,我们把信息交给了AccessGateway,可是我们却传入了context的参数,这个有什么用呢?这个就进入我们今天的话题了,这个context我们可以翻译为上下文,但在项目中,你会感觉叫它容器更为合适。我们继续看AccessGateway中是如何处理的。

//IC业务的处理
    	if (object != null && IC_SERVICE_ID.equals(serviceId))
    	{
    		context = new ICContext();
    		Customer customer = (Customer)object;
    		
    		//AG只是做简单判断,传入的信息不为空就行了,其实还可以做更多的判断
    		//只有通过了AG的验证成功之后才可进入到IC的业务处理
    		if ("".equals(customer.getUsename()) || "".equals(customer.getPassword()))
    		{
    			JOptionPane.showMessageDialog(null,
    			          "Your information is wrong!", "Error",
    			          JOptionPane.ERROR_MESSAGE);
    		}
    		else
    		{
    			context.setParams("usename", customer.getUsename());
    			context.setParams("password", customer.getPassword());
    			IndetityCenter.doReceive(context);
    		}
    		
    	}

4)        通过上面的代码,我们看到了最后我们明确了是用什么context,我们用的是管理用户的context,并且将用户名和密码放入到了context中,那么我们就调用了IdetityCenter的方法。下面是用户管理IdetityCenter的代码。

 public static void doReceive(Context context)
    {
    	
    	if ("owen".equals(context.getParams("usename")) 
    			 && "1234".equals(context.getParams("password")))
    	{
    		context = new MQContext();
    		context.setParams("IC","SYS0000");
    	}
    	else
    	{
    		context = new MQContext();
    		context.setParams("IC","IC400");
    	}
    }

5)        可以看到,IdetityCenter在处理时,直接从context中获取所需要的资源。那么上面出现的ICContext,到底是什么呢?我们见识一下它的真面目。

public class ICContext implements Context
{
	public static  Map<String,Object> ICContext;
	 static
	    {
	    	ICContext = new HashMap<String,Object>();
	    }

	@Override
	public void setParams(String key, Object value)
	{
		ICContext.put(key, value);
		
	}
	@Override
	public Object getParams(String key)
	{
		return ICContext.get(key);
	}
}

6)        现在见到了它的真实面目了,它不过就是Map的java实用类库的Map.所以它就像是个容器同,里面可以放置不同的东西,只要你要用的时候,你使用key的属性,就可得到value的值了。

4.2 交易处理

1)        当用户登录成功之后,接下来就可以让用户做交易了。由于我们重点是关于Context的理解,所以交易这里只是简单的模拟一下。相信,那过上面的用户登录,读者已经了解Context的用法。我们完整跑一笔交易,模拟结果如下:

容器(Context)使用之支付系统_第3张图片

2)        看到上面的完整交易,我们应该知道。首先,我们需要显示出菜单让用户选择交易。下面是关于这个代码的实现。

/**
	 * 显示菜单
	 * @param num 菜单对应 的数据
	 */
	public static void getInputNUm(String num)
	{
		 switch (read)
			{
			case "1":
				System.out.println("Cash in : please enter your amount:");
				String amount = scan.next();
				System.out.println("Cash in : please enter your password:");
				String pass = scan.next();
				Account account = new Account(pass,amount,"1");
				 AccessGateway.doService(context, "TC", account);
				
				break;
			case "2":
				//TODO
				System.out.println("Cash out");
				break;
			case "3":
				//TODO
				System.out.println("Request Loan");
				break;
			}
	}

3)        当用户选择好了要进行的业务之后,跟用户登录的处理是一样的,都要先经过AccessGateway,然后再到达TransactionCenter,而且一样的都是用相应的Context.gh 下面是TransactionCenter的处理代码。

public static void doReceive(Context context)
    {
    	 scan = new Scanner(System.in);
    	 System.out.println("Do you want to cash in "+ context.getParams("amount") +"?(Y/N)");
	     read = scan.next();
	     
	     if ("Y".equals(read))
	     {
	    	 System.out.println("TC receive from AG");
	     	 System.out.println(
	     			          "amount:" + context.getParams("amount") +
	     			          "pass:" + context.getParams("pass") );
	     }
	     else
	     {
	    	 System.out.println("you cancel the transaction!");
	     }
    	
    }

5.总结

    这里我们主要是要知道Context在项目中的使用,说白了它就是个容器,或者它就是Map类型。它的应用可以方便开发,对于大公司来说,开发模块分地很清楚,使用Context的设计,那么不同模块之间的协作就会方便多了,提高开发效率。同时,我们也学习了对于金融的业务,不同业务之间是怎样协作的,上面的时序图就很清晰了。










你可能感兴趣的:(java,支付,map,缓存,容器)