假如有一个使用账号密码登录功能,我们写这样一个类:
public class Login {
public void print() {
System.out.println("专注于账号密码登录中...");
}
}
现在想在登录之前和之后分别想打点上报,但是打点上报却不属于登录的操作,我们不想把上报的代码写在登录模块中,于是我们可以这样写
public class LoginProxy {
private Login login;
public LoginProxy(Login login) {
this.login = login;
}
public void print() {
System.out.println("在登录之前上报...");
login.print();
System.out.println("在登录之后上报...");
}
}
使用方法
public static void main(String[] args) {
Login login = new Login();
LoginProxy loginProxy = new LoginProxy(login);
loginProxy.print();
}
这样在不丝毫影响登录模块的情况下实现登录前后的上报功能,这其实就是静态代理的实现,Login是被代理对象,LoginProxy是代理对象。
现在增加需求,要实现微信登录,于是增加一个登录类
public class WechatLogin {
public void print() {
System.out.println("专注于微信登录中...");
}
}
代理类
public class WechatLoginProxy {
private WechatLogin wechatLogin;
public WechatLoginProxy(WechatLogin wechatLogin) {
this.wechatLogin = wechatLogin;
}
public void print() {
System.out.println("在登录之前上报...");
wechatLogin.print();
System.out.println("在登录之后上报...");
}
}
这时候又增加需求,要实现QQ登录,于是新建QQLogin、QQLoginProxy......
在使用时太麻烦了,不符合设计原则,来改造一番。
新增接口:
public interface LoginInterface {
public void print();
}
改造Login:
public class Login implements LoginInterface{
@Override
public void print() {
System.out.println("专注于账号密码登录中...");
}
}
改造WechatLogin:
public class WechatLogin implements LoginInterface{
@Override
public void print() {
System.out.println("专注于微信登录中...");
}
}
接着改造LoginProxy:
public class LoginProxy implements LoginInterface{
private LoginInterface login;
public LoginProxy(LoginInterface login) {
this.login = login;
}
@Override
public void print() {
System.out.println("在登录之前上报...");
login.print();
System.out.println("在登录之后上报...");
}
}
WechatLoginProxy:
public class WechatLoginProxy {
private WechatLogin wechatLogin;
public WechatLoginProxy(WechatLogin wechatLogin) {
this.wechatLogin = wechatLogin;
}
public void print() {
System.out.println("在登录之前上报...");
wechatLogin.print();
System.out.println("在登录之后上报...");
}
}
使用时,想怎么登录直接传对应构造参数就行了
public static void main(String[] args) {
//账号密码登录
LoginProxy loginProxy = new LoginProxy(new Login());
loginProxy.print();
//微信登录
LoginProxy wechatProxy = new LoginProxy(new WechatLogin());
wechatProxy.print();
}
打印结果:
在登录之前上报...
专注于账号密码登录中...
在登录之后上报...
在登录之前上报...
专注于微信登录中...
在登录之后上报...
到此,一个标准的静态代理就出现了,之前查了一些静态代理资料,都有一句话:代理对象和被代理对象必须实现同一个接口。个人理解这样说的太绝对,其实不实现也可以实现静态代理的功能和运用原理,实现接口只是为了遵循面向接口编程的设计原则而已,和静态代理没有关系。
网友评论