您的位置:首页 > 其它

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

2016-04-25 00:14 405 查看

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. 例子时序图



4. 实现详解

4.1用户登录

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的值了。

4.2 交易处理

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!");
}

}

5.总结

这里我们主要是要知道Context在项目中的使用,说白了它就是个容器,或者它就是Map类型。它的应用可以方便开发,对于大公司来说,开发模块分地很清楚,使用Context的设计,那么不同模块之间的协作就会方便多了,提高开发效率。同时,我们也学习了对于金融的业务,不同业务之间是怎样协作的,上面的时序图就很清晰了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: