定义:为其他对象提供一种代理以控制这个对象的访问。
使用场景:在一些情况下,客户端不能直接访问一个对象,那么代理就起到中介的作用。有时,一次性创建一个对象需要很大开销时,可以使用代理来存储这个对象的信息,当需要那一部分时,再由创建。有时,当使用一个对象之前还需要做一些处理,这时候也可以用到代理。
一个最简单的代理模式的demo:我们在登陆一个系统时,登陆之前先检查用户名是否合法,并且纪录登陆和退出的时间。代码如下:
public class LoginAction {
private String username;
private String password;
public LoginAction(String username,String password) {
this.username = username;
this.password = password;
}
public void login() {
System.out.println(username+",login success!");
}
public void loginOut() {
System.out.println(username+",88");
}
}
public class LoginActionProxy {
public void login(String username,String password) {
if(check(username)) {
LoginAction loginAction = new LoginAction(username, password);
loginAction.login();
}
}
public void loginOut(String username) {
logEnd(username);
}
private boolean check(String username) {
System.out.println(username+" is ok!");
return true;
}
private void logStart(String username) {
System.out.println(username+",start,time="+System.currentTimeMillis());
}
private void logEnd(String username) {
System.out.println(username+",end,time="+System.currentTimeMillis());
}
}
public class Client {
public static void main(String[] args) {
String username = "zhangsan";
String password = "111222";
LoginActionProxy proxy = new LoginActionProxy();
proxy.login(username, password);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
proxy.loginOut(username);
}
}