- 代理模式:自己的事交给别人去做,分别返回处理结果即可,如异步线程;
通过代理,控制对对象的访问。可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。
- 静态代理
public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signContract();
/**
* 订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
public class RealStar implements Star{
@Override
public void confer() {
System.out.println("====RealStar.confer()");
}
@Override
public void signContract() {
System.out.println("====RealStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("====RealStar.bookTicket()");
}
@Override
public void sing() {
System.out.println("====RealStar.sing()");
}
@Override
public void collectMoney() {
System.out.println("====RealStar.collectMoney()");
}
}
public class ProxyStar implements Star{
private Star star;
public ProxyStar(Star star) {
super();
this.star = star;
}
@Override
public void confer() {
System.out.println("====ProxyStar.confer()");
}
@Override
public void signContract() {
System.out.println("====ProxyStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("====ProxyStar.bookTicket()");
}
@Override
public void sing() {
star.sing();
}
@Override
public void collectMoney() {
System.out.println("====ProxyStar.collectMoney()");
}
}
public class Test {
public static void main(String[] args) {
Star real = new RealStar();
Star proxyStar = new ProxyStar(real);
proxyStar.bookTicket();
proxyStar.collectMoney();
proxyStar.confer();
proxyStar.sing();
}
}
- 动态代理
JDK自带的动态代理
-java.lang.reflect.Proxy
作用:动态生成代理类和对象
-java.lang.reflect.InvocationHandler(处理器接口)
·可以通过invoke方法实现对真实角色的代理访问。
·每次通过Proxy生成代理类对象时都要指定对应的处理对象
public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signContract();
/**
* 订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
public class RealStar implements Star{
@Override
public void confer() {
System.out.println("====RealStar.confer()");
}
@Override
public void signContract() {
System.out.println("====RealStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("====RealStar.bookTicket()");
}
@Override
public void sing() {
System.out.println("====RealStar.sing()");
}
@Override
public void collectMoney() {
System.out.println("====RealStar.collectMoney()");
}
}
public class StarHandler implements InvocationHandler{
private Star realStar;
public StarHandler(Star realStar) {
super();
this.realStar = realStar;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
method.invoke(realStar, args);
return null;
}
}
public class Test {
public static void main(String[] args) {
Star real = new RealStar();
StarHandler handler = new StarHandler(real);
Star proxy = (Star)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
proxy.bookTicket();
proxy.collectMoney();
proxy.signContract();
proxy.sing();
}
}