代理模式
静态代理模式:
代理:
代理可以帮助被代理者完成前期的准备工作,后期的善后工作。核心的业务逻辑任然由被代理者完成。
代码结构:
(1)接口:主题
(2)被代理者
(3)代理者
要求:代理类和被代理类实现同一个主题接口
代理类中要有一个被代理类的属性(target),这样才能把核心业务代码交给被代理者完成
这些需求是和核心业务逻辑无关的代码;而且多变,那么这样的代码可以交给代理完成。
需求:
(1)要计算add()的运行时间
(2)记录add()的开始执行,已经结束执行的时间到日志中
public class TestProxy {
public static void main(String[] args) {
//使用代理类和被代理类来完成工作
UserDAO bei = new UserDAO();//被代理者
UserDAOProxy up = new UserDAOProxy(bei);//代理者
up.add();
}
}
//操作数据库的数据
interface DAO{
void add();
}
class UserDAO implements DAO{
@Override
public void add() {
System.out.println("添加用户");
}
}
class UserDAOProxy implements DAO{
private UserDAO target;//被代理者
//你可以用set方法或者构造器给它赋值
//这里用构造器给他赋值
public UserDAOProxy(UserDAO target) {
super();
this.target = target;
}
@Override
public void add() {
System.out.println("add方法开始执行");
long start = System.currentTimeMillis();
//核心业务逻辑要交还给被代理者完成
target.add();
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
System.out.println("add方法结束执行");
}
}
示例:
//有一个接口
interface Subject{
void doWork();
}
//被代理类
class RealClass implements Subject{
@Override
public void doWork() {
System.out.println("我是干实事的");
}
}
//代理类,真正的业务在这里实现
class HelpClass implements Subject{
private Subject target;
public HelpClass(Subject target) {
this.target = target;
}
@Override
public void doWork() {
System.out.println("我是来视察的");
target.doWork();
System.out.println("干的不错");
}
}