10分钟理解代理——静态代理

引子:
如果你是一名程序员,那么你肯定曾经听说过一个名词——“代理",有时你听到的是”静态代理“,有时则是”动态代理“。光从字面上看,差不多就能理解二则差异的50%(如果你还不知道什么是代理)。静态就是静止不动,不会变化的;动态刚好相反。那么问题的最根本的地方应该在于什么是代理?

什么是代理:
举个形象的栗子:张三在某宝上买了一件T恤,收获地址是住宅a地,某种原因导致物流比预期的晚了点,此时张三已到b地和妹子约会,以至于张三无法拿到快递。为了收下快递员送上门的快递,张三就会叫他的好基友邻居李四帮忙收下。李四在帮忙领取快递时只需要向快递员解释一下情况,回答一些有关张三的必要信息就可以从快递小哥那接下包裹。那么在这个过程中,李四就是代理,张三是被代理的对象。使用代理的好处就是及时的领取了快递,张三也不必快马加鞭赶回家去处理一件小事而耽误了甜蜜时光,对不对?所以代理是个好东西。

什么是动(静)态代理:
再举一个栗子:还是上面的情形。只不过王五需要找人帮忙浇一下门口的月季花,王五也是李四的好基友邻居。李四帮忙领完张三的快递后,又给王五的花浇了水。那么王五就是”动态的代理“,既能帮助领快递,又能帮助浇水(只要是好邻居基友就能帮助)。如果李四只帮助收取快递而不做其他的,那么李四此时就是静态的代理了。


啰哩啰嗦了半天好像你该晕了。

下面我们用代码来模拟一下上面的场景


静态的代理比较容易理解,实现起来也比较简单:
创建一个领快递的接口:Receiver 它的一个主要方法是 void receive()接收快递 
 
package staticproxy;

public interface Receiver {
void receive();

String getName();
}
  
然后在创建类Zhangshan,Lisi 实现 Receiver接口

张三类:

package staticproxy;

public class Zhangshan implements Receiver {

@Override
public void receive() {
System.out.println(getName() + "此时和妹妹在约会,无法收取快件");
}

@Override
public String getName() {
return "张三";
}

}

Lisi类
package staticproxy;

public class Lisi implements Receiver {

private Receiver receiver;

public Lisi(Receiver receiver) {
super();
this.receiver = receiver;
}

@Override
public void receive() {
receiver.receive();
System.out.println(this.getName() + "帮忙收取了" + receiver.getName() + "的快递");
}

@Override
public String getName() {
return "李四";
}

}


区别是Zhangshan 的 receive()方法是行不通的(打印”张三此时和妹妹在约会,无法收取快件“)

测试类
package staticproxy;

public class TestStaticProxy {
public static void main(String[] args) {
Receiver zhangshan = new Zhangshan();
Receiver lisi = new Lisi(zhangshan);
lisi.receive();
}
}

运行结果:

张三此时和妹妹在约会,无法收取快件
李四帮忙收取了张三的快递

从代码上来看,代理的好处是,我们不需要直接调用zhangshan.receive()就能实现zhangshan.receive()的执行效果(打印”张三此时和妹妹在约会,无法收取快件“)。而是通过将张三设置成与张三拥有共同接口的李四的成员变量,通过李四的某些方法来触发张三的目标方法。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值