前言
迭代器设计模式系列文章
迭代器设计模式(一) - 简介
迭代器设计模式(二) - 早期qq和微信用户登录系统一般写法
迭代器设计模式(三) - 早期qq和微信用户登录系统迭代器设计模式写法
迭代器设计模式(四) - 使用场景
迭代器设计模式(五) - 底部导航栏
1. 实现
实现步骤:
1>:创建用户信息实体对象UserInfo;
2>:创建qq用户系统,采用List集合存储数据;
3>:创建微信用户系统,采用数组存储数据;
4>:定义测试客户端Client进行测试:
a:首先调用qq登录用户信息接口,查询qq用户信息,获取loginUserInfo对象;
b:如果 loginUserInfo对象为null,就调用微信接口查询微信用户信息,获取loginUserInfo对象;
c:如果 loginUserInfo对象也是null,就说明用户名或者密码错误;
具体实现如下:
2. 代码如下
1>:创建用户信息实体对象UserInfo:
/**
* Email: [email protected]
* Created by Novate 2018/6/3 11:04
* Version 1.0
* Params:
* Description: 用户信息实体
*/
public class UserInfo {
public String userName ;
public String userPwd ;
public String userId ;
public String userSex ;
public UserInfo(String userName, String userPwd, String userId, String userSex) {
this.userName = userName;
this.userPwd = userPwd;
this.userId = userId;
this.userSex = userSex;
}
@Override
public String toString() {
return "UserInfo{" +
"userName='" + userName + '\'' +
", userPwd='" + userPwd + '\'' +
", userId='" + userId + '\'' +
", userSex='" + userSex + '\'' +
'}';
}
}
2>:创建qq用户系统,采用List集合存储数据:
/**
* Email: [email protected]
* Created by Novate 2018/6/3 11:09
* Version 1.0
* Params:
* Description: QQ用户系统 - list集合存储
*/
public class QQUserSystem {
private List userInfos ;
public QQUserSystem(){
userInfos = new ArrayList<>() ;
userInfos.add(new UserInfo("Novate","123456","001","男")) ;
userInfos.add(new UserInfo("王子文","234567","002","女")) ;
userInfos.add(new UserInfo("世道无情","345678","003","男")) ;
}
public List getUserInfos(){
return userInfos ;
}
}
3>:创建微信用户系统,采用数组存储数据:
/**
* Email: [email protected]
* Created by Novate 2018/6/3 11:10
* Version 1.0
* Params:
* Description: 微信的用户系统 - 数组存储
*/
public class WXUserSystem {
UserInfo[] userInfos ;
public WXUserSystem(){
userInfos = new UserInfo[3] ;
userInfos[0] = new UserInfo("Novate","123456","001","男") ;
userInfos[1] = new UserInfo("景甜","234567","002","女") ;
userInfos[2] = new UserInfo("江疏影","345678","003","男") ;
}
public UserInfo[] getUserInfos() {
return userInfos;
}
}
4>:定义测试客户端Client进行测试:
a:首先调用qq登录用户信息接口,查询qq用户信息,获取loginUserInfo对象;
b:如果 loginUserInfo对象为null,就调用微信接口查询微信用户信息,获取loginUserInfo对象;
c:如果 loginUserInfo对象也是null,就说明用户名或者密码错误;
/**
* Email: [email protected]
* Created by Novate 2018/6/3 11:23
* Version 1.0
* Params:
* Description: 一般写法 - 没有采用设计模式之前
*/
public class Client {
public static void main(String[] args){
// 根据用户名和密码查询用户信息 ,
// 如果没有查询到,那么代表登录失败;如果查询到了,代表登录成功
UserInfo loginUserInfo = queryWXUserInfo("王子文" , "234") ;
// 如果 loginUserInfo为null,就从QQ系统中查询用户信息
if (loginUserInfo == null){
loginUserInfo = queryQQUserInfo("王子文" , "234") ;
}
// 现在我只是接入了2个系统,以后我可能需要接入更多的系统,那么如果还是这样写的话,就会产生代码冗余,产生很多重复的代码,
// 所以这种写法肯定是不可取的,那么接下来我们就来看下采用设计模式是如何写的?
// 继续判断,如果这个时候 loginUserInfo还是null,表示登录失败,用户名和密码错误
if (loginUserInfo == null){
}
}
/**
* 从QQ中查询用户信息
*/
private static UserInfo queryQQUserInfo(String userName, String userPwd) {
QQUserSystem qqUserSystem = new QQUserSystem() ;
List userInfos = qqUserSystem.getUserInfos();
for (UserInfo userInfo : userInfos) {
if (userInfo.userName.equals(userName) && userInfo.userPwd.equals(userPwd)){
return userInfo ;
}
}
return null;
}
/**
* 从微信中查询用户信息
*/
private static UserInfo queryWXUserInfo(String userName, String userPwd) {
WXUserSystem wxUserSystem = new WXUserSystem() ;
UserInfo[] userInfos = wxUserSystem.getUserInfos();
for (UserInfo userInfo : userInfos) {
if (userInfo.userName.equals(userName) && userInfo.userPwd.equals(userPwd)){
return userInfo ;
}
}
return null;
}
}
3. 一般写法的弊端
在Client测试客户端中,如果有2个用户信息系统,qq和微信,那么就需要调用2个对应的用户信息接口,如果有多个用户信息系统,可能就需要在main()方法中写多个if...else...,这种做法可定是不可取的,那么下一节我们就来看下迭代器设计模式是如何实现的;