一、代理模式说明:
1. 什么情况下使用代理模式?想在B中访问A中的方法,但是B和A没有直接的关系,这时,可以通过B访问代理C,而代理C可以直接访问A中的方法,就可以采用代理模式。如下图所示:
2. 代理模式主要分为三个部分:主题接口、代理主题、真实主题。代理模式的结构图如下图所示:
二、Java语言描述
package com.solid.pattern;
/**
* 代理模式(主题接口)
* @author solid
*/
public interface Subject {
public void doSubject();
}
package com.solid.pattern;
/**
* 代理模式(代理主题)
* @author solid
*/
public class ProxySubject implements Subject {
private RealSubject realSubject;
public void doSubject() {
preDoSubject();
if(realSubject == null) {
realSubject = new RealSubject();
}
realSubject.doSubject();
aftDoSubject();
}
private void aftDoSubject() {
System.out.println("===aftDoSubject===");
}
private void preDoSubject() {
System.out.println("===preDoSubject===");
}
}
package com.solid.pattern;
/**
* 代理模式(真实主题)
* @author solid
*/
public class RealSubject implements Subject {
public void doSubject() {
System.out.println("===通过代理调用此方法===");
}
}
package com.solid.pattern;
/**
* 代理模式(测试方法)
* @author solid
*/
public class TestProxy {
public static void main(String[] args) {
Subject subject = new ProxySubject();
subject.doSubject();
}
}
三、代理模式的应用
假设有这样一个需求,写一个用户登录模块,要求用户登录前,检查用户的合法性,是否允许登录。如果不合法,不允许登录,反之,如果登录后,记录用户的登录日志。(使用代理模式实现)。示意性的代码可以如下描述:
package com.solid.pattern;
/**
* 代理模式(登陆接口)
* @author solid
*/
public interface Login {
public String login();
}
package com.solid.pattern;
/**
* 代理模式(真实登陆)
* @author solid
*/
public class RealLogin implements Login {
public String login() {
//用户登录信息记录
return null;
}
}
package com.solid.pattern;
/**
* 代理模式(代理登陆)
* @author solid
*/
public class ProxyLogin implements Login {
private RealLogin realLogin;
private Check check;
private Logger logger;
private String result;
public String login() {
if(check.check()) {
realLogin.login();
result = logger.logger();
} else {
return null;
}
return result;
}
}
package com.solid.pattern;
/**
* 有效性验证类
* @author solid
*/
public class Check {
private String username;
private String password;
public boolean check() {
if(username.equals("admin") && password.equals("admin")) {
return true;
} else {
return false;
}
}
}
package com.solid.pattern;
/**
* 登陆日志记录类
* @author solid
*/
public class Logger {
private String logger;
public String logger() {
//记录日志
return logger;
}
}