什么是代理模式
我觉得代理模式就是为一个对象提供了一个替身,并通过这个替身去访问目标对象,以增加功能
例如:张三打官司,可是张三不懂法,所以聘请一个叫罗翔的律师去帮助张三处理案件就相当于张三也懂法律了,这里的张三是被代理类,罗翔是代理类。
代理模式有不同的形式,主要有三种静态代理、动态代理(jdk代理)和cglib代理。这次主要谈论静态代理模式
什么是静态代理模式
静态代理在使用时需要定义接口或者父类被代理对象与代理对象起实现相同的接口或者是继承相同父类。
具体应该具有这些要求
- 定义一个接口
- 目标对象实现接口
- 代理对象也实现接口
- 调用代理对象的方法来调用目标对象
案例
b站用户分为两种,一种是大会员,一种是普通会员。
普通会员可以观看用户投稿的视频,大会员额外可以观看正版番剧。他们的权限是不一样的。
现在要使用代理模式模拟b站用户的权限管理。
类图
代码
首先定义一个接口,定义看的方法
package proxy;
//接口
public interface IUser {
void see();//看的方法
}
第二步定义一个被代理类调用接口,并重写接口的方法
package proxy;
//被代理类
public class User implements IUser {
@Override
public void see() {
// TODO Auto-generated method stub
System.out.println("可以观看用户投稿的视频");
}
}
第三步定义一个代理类调用接口重写接口的方法,并通过接口去聚合目标对象
package proxy;
//代理类
public class UserProxy implements IUser {
private IUser target;//通过接口来聚合目标对象,是目标对象成为代理类的一部分
//构造器
public UserProxy(IUser target) {
this.target = target;
}
@Override
public void see() {
// TODO Auto-generated method stub
System.out.println("你是大会员");
System.out.println("可以看正版番剧");
target.see();
}
}
最后编写客户端
package proxy;
//客户端
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个被代理对象
User user = new User();
//直接实现被代理对象的方法
user.see();
System.out.println("**************");
//创建一个代理对象,并将被代理对象传递给代理对象
UserProxy userProxy = new UserProxy(user);
//通过代理对象实现被代理对象的方法
userProxy.see();
}
}
运行截图
静态代理优缺点
优点:
在不修改目标对象的功能前提下,能通过代理对象对目标功能扩展
缺点
类的数量变多了,而且一旦接口增加方法目标对象与代理对象都要维护
希望对看到这里的诸位有所帮助,如果喜欢这篇个人理解不妨点一个赞,谢谢~。