可能提起容器,大家第一感觉想到的就是Java实用类库中的List、Set、Queue和Map等类型。在《Thinkin java》一书中有这样的说法,这些对象类型也称为集合类,但由于Java的类库中使用了Collection这个名字来指代该类库的一些特殊子集,所以我们使用了更广的术语“容器”称呼它们。而在技术有这样的说法,现在中容器的时代。我个人是持有赞同态度的。比如,现在我们开发的缓存技术,不就是用到容器的思想吗?所以,根据笔者在某家知名公司接触的系统来谈谈Context。可能读者会觉得迷惑,不是讲容器吗?怎么说到Context了。至于为什么?就带着这样的迷惑进入文章。(源码:链接:http://pan.baidu.com/s/1mhHrykC 密码:h6b2)
现在我们要实现一个支付的例子。这个例子是这样的,用户要使用我们的系统时,首先要先登录,登录的信息首先要经过接口(AccessGateway),对用户的输入的信息先做筛选判断,保证没有输入不规范的信息,只有确认用户没故意破坏我们的系统情况下,接口可以将信息进行封装好了之后,将信息传送给处理用户的类(IndetityCenter)进行处理,这里需要这个类查找数据库,然后判断用户的信息是否存在。我们就假设存在,那么IndetityCenter需要返回信息,提示可以进行下一步的操作,就是交易类(TransactionCenter)处理。可是还是要用户输入他要进行的业务,业务有:存款、取款、贷款。用户选择好要进行的业务之后,还是要AccessGateway告诉TransactionCenter去处理。最后处理的结果怎样,TransactionCenter要告诉AccessGateway,由AccessGateway去通知用户,这一步可能在例子中没有实现。
1) 用户登录,我们这里实现可能比较简单,只是需要输入用户名和密码就行了。同时,我们这里并没有用户数据库,中是指定个用户owen,密码123就可以了。在实际中,肯定要建表来做的。下面是登录图。
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的值了。
1) 当用户登录成功之后,接下来就可以让用户做交易了。由于我们重点是关于Context的理解,所以交易这里只是简单的模拟一下。相信,那过上面的用户登录,读者已经了解Context的用法。我们完整跑一笔交易,模拟结果如下:
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!"); } }
这里我们主要是要知道Context在项目中的使用,说白了它就是个容器,或者它就是Map类型。它的应用可以方便开发,对于大公司来说,开发模块分地很清楚,使用Context的设计,那么不同模块之间的协作就会方便多了,提高开发效率。同时,我们也学习了对于金融的业务,不同业务之间是怎样协作的,上面的时序图就很清晰了。