代理
代理,就是对接,就是对接口。
例:航空公司卖机票。机票代售点,就可以帮它卖。
以就是客户与航空公司直接打交道,直接对接;有了代售点后,客户与代售点进行直接对接, 客户与航空公司售票部就是间接的了。
代理起到的作用是对接, 不是替换。代售点卖的是航空公司的票,不是自己发行的票。
静态代理
它是一个代理,但这个代理只会对接一种事。这就是静态,所谓静态,就是一成不变。例:航空公司卖机票。机票代售点,就可以帮它对接卖机票。
动态代理
它就一个代理,但这个代理会对接各种各样的事。这就是动态,所谓动态,就是会变,会成不同的事。掮客是指替人介绍买卖,对接买卖。例:换上西装卖保险,穿上围裙卖猪肉,戴上眼镜卖机票。还可以做其它代理工作
// 一件事,(销售机票)
public interface Interface {
void SellTicket(){
}
}
// 原本需要航空公司销售
public AirCompanySell Implement Interface{
@override
void SellTicket(){
System.out.println("Air company sells tickets!");
}
}
// 代售点销售 <静态代理>
public TicketAgent Implement Interface{
private Interface proxied;
public TicketAgent(Interface sell){
this.proxied = sell;
}
@override
void SellTicket(){
this.proxied.SellTicket();
System.out.println("Proxy sells ticks!");
}
}
// 掮客
public class MidMan implements InvocationHandler{ // 实现干事接口
private Object proxied; // 被 代理对象
// 穿、戴变成相应代理身份
public Object GetInstance(Object obj){
this.proxied = obj;
Class clazz = obj.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this); // 穿了外衣的掮客对象
}
@Override
public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
System.out.println("做事开始了..");
//第一个参数是proxied,也就是被代理类的对象;第二个参数是方法中的参数
method.invoke(proxied, args);
System.out.println("做事完了..");
return null;
}
}
// 驾驶
public interface IDrive{
public void Drive() {
}
}
// 开车回家
public DriveHome implement IDrive{
@override
public void Drive(){
System.out.println("drive to home");
}
}
//
public class Test{
public static void main(String[] args){
Sell sell = new TicketAgent(new AirCompanySell());
sell.SellTicket();
// 动态代理
sell = (Sell) new MidMan().getInstance(new AirCompanySell());
sell.SellTicket();
// 动态代理
IDrive driver = (IDrive)new MidMan().GetInstance(new DriveHome());
driver.Drive();
}
}
这样动态代理, 就是完全对接了任何对象的事,事前事后,还能加点料。