设计模式-服务定位器模式
Posted 技术趋势
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-服务定位器模式相关的知识,希望对你有一定的参考价值。
上文(设计模式-拦截过滤器模式):
背景
服务定位器模式是什么?
服务定位器模式可以干嘛?
个人理解:
服务定位器模式类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
/**
* @Auther: csh
* @Date: 2020/7/5 11:44
* @Description:抽象的服务接口
*/
public interface IUserInfo {
public String getName();
public void printUserInfo();
}
/**
* @Auther: csh
* @Date: 2020/7/5 11:45
* @Description:用户信息(Service)
*/
public class User implements IUserInfo {
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
private User() {
}
public User(String usreName) {
this.userName = usreName;
}
public String getName() {
return userName;
}
public void printUserInfo() {
System.out.println("用户信息:"+this.getName());
}
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
'}';
}
}
/**
* @Auther: csh
* @Date: 2020/7/5 11:48
* @Description:创建对象(Context )
*/
public class InitialContext {
private static InitialContext initialContext = new InitialContext();
private InitialContext(){
}
public static InitialContext getInstance(){
return initialContext;
}
public Object lookup(String username){
return new User(username);
}
}
/**
* @Auther: csh
* @Date: 2020/7/5 11:51
* @Description:用户缓存
*/
public class UserCache {
private List<IUserInfo> userInfos;
public UserCache() {
userInfos = new ArrayList <IUserInfo>();
}
public IUserInfo getUserInfo(String userName){
for (IUserInfo userInfo : userInfos) {
if(userInfo.getName().equalsIgnoreCase(userName)){
System.out.println("从缓存中获取到用户信息:"+userInfo.toString());
return userInfo;
}
}
return null;
}
public void addUserInfo(IUserInfo userInfo){
boolean exist = false;
for (IUserInfo info : userInfos) {
if(info.getName().equalsIgnoreCase(userInfo.getName())){
exist = true;
}
}
if(!exist){
userInfos.add(userInfo);
}
}
}
/**
* @Auther: csh
* @Date: 2020/7/5 12:06
* @Description:服务定位器(Service Locator)
*/
public class UserInfoLocator {
private static UserCache userCache = new UserCache();
public static IUserInfo getUserInfo(String userName){
IUserInfo userInfo = userCache.getUserInfo(userName);
if(userInfo!=null){
return userInfo;
}
InitialContext instance = InitialContext.getInstance();
IUserInfo user = (IUserInfo)instance.lookup(userName);
userCache.addUserInfo(user);
return user;
}
}
/**
* @Auther: csh
* @Date: 2020/7/5 12:51
* @Description:服务定位器模式
*/
public class Client {
public static void main(String[] args) {
IUserInfo userInfo = UserInfoLocator.getUserInfo("user1");
userInfo.printUserInfo();
userInfo = UserInfoLocator.getUserInfo("user2");
userInfo.printUserInfo();
userInfo = UserInfoLocator.getUserInfo("user1");
userInfo.printUserInfo();
}
}
结果
用户信息:user1
用户信息:user2
从缓存中获取到用户信息:User{userName='user1'}
用户信息:user1
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
最后
参考文章:
https://www.oracle.com/technetwork/java/servicelocator-137181.html
http://gameprogrammingpatterns.com/service-locator.html
以上是关于设计模式-服务定位器模式的主要内容,如果未能解决你的问题,请参考以下文章