前言
代理设计模式系列文章
代理设计模式(一) - 定义、角色划分
代理设计模式(二) - 静态代理
代理设计模式(三) - 动态代理
代理设计模式(四) - 实现 Retrofit 的 onCreate()
1. 银行工作人员帮我们办理业务 - 静态代理实现
思路:
1>:首先创建目标接口IBank,里边写一个applyBank()办卡的方法;
2>:定义银行工作人员的类BankWorker,作为代理对象,这里的银行工作人员需要持有被代理的对象;
3>:定义被代理对象Man,即就是我或者办卡的人;
4>:然后定义Client来测试即可;
2. 代码如下
1>:首先创建目标接口IBank,里边写一个applyBank()办卡的方法:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 10:10
* Version 1.0
* Params:
* Description: 银行办理业务 - 目标接口
*/
public interface IBank {
/**
* 申请办卡
*/
void applyBank() ;
/**
* 挂失
*/
// void lostBank() ;
}
2>:定义银行工作人员的类BankWorker,作为代理对象,这里的银行工作人员需要持有被代理的对象:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 10:11
* Version 1.0
* Params:
* Description: 代理对象 - 银行的工作人员
*/
public class BankWorker implements IBank{
// 银行工作人员,需要持有被代理的对象(我或者办卡的人)
private IBank bank ;
public BankWorker(IBank bank){
this.bank = bank ;
}
@Override
public void applyBank() {
System.out.println("开始受理");
bank.applyBank();
System.out.println("操作完毕");
}
}
3>:定义代理对象,即就是我或者办卡的人:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 10:13
* Version 1.0
* Params:
* Description: 被代理的对象 - 我(办卡的人)
*/
public class Man implements IBank{
private String name ;
public Man(String name){
this.name = name ;
}
/**
* 我(办卡的人) 自己的操作
*/
@Override
public void applyBank() {
System.out.println("申请办卡");
}
}
4>:然后定义Client来测试即可:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 10:17
* Version 1.0
* Params:
* Description:
*/
public class Client {
public static void main(String[] args){
Man man = new Man("Novate") ;
BankWorker bankWorder = new BankWorker(man) ;
bankWorder.applyBank();
}
}
运行结果如下:
开始受理
申请办卡
操作完毕
Process finished with exit code 0
2. 静态代理缺点
如果银行卡丢失,这个时候需要在目标接口的IBank中添加 lostBank()方法,这个时候就会发现所有与 IBank相关的类全部报错,非常麻烦,而且添加 挂失的lostBank()方法后,对于挂失银行卡的代码与办卡代码绝大部分一样,会写一些冗余的代码,比较麻烦,那么这个时候我们动态代理就诞生了,那么下一节我们就来看下动态代理是如何解决这个弊端的。