本文主要是介绍你的代言人-代理模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概述
代理模式为其他对象提供一种代理以控制对这个对象的访问。也就是当你想访问某个对象时,不能直接访问它而需要通过它的代理对象来进行访问。就好比你要拜访某位名人,都是需要先通过他的助理,助理在这里就起到了代理的作用。
类图
在代理模式中,有几种角色
- 抽象角色(AbstractSales)定义了抽象的产品
- 真实角色(RealSales)抽象产品的实现者
- 代理角色(ProxySales)负责代理RealSeles的所有功能
代码实现
//抽象角色
public abstract class AbstractSales {public abstract void sales();public abstract void price();
}//真实角色
public class RealSales extends AbstractSales {@Overridepublic void sales() {System.out.println("Real sales");}@Overridepublic void price() {System.out.println("Real price");}
}//代理角色
public class ProxySales extends AbstractSales {private RealSales realSales;public ProxySales(){this.realSales = new RealSales();}@Overridepublic void sales() {this.realSales.sales();}@Overridepublic void price() {this.realSales.price();}
}public class Client {public static void main(String [] args){AbstractSales sales = new ProxySales();sales.sales();sales.price();}
}输出结果
Real sales
Real price
其实,在代理类中还可以加上额外的处理,比如:
public class ProxySales extends AbstractSales {private RealSales realSales;public ProxySales(){this.realSales = new RealSales();}@Overridepublic void sales() {this.before();this.realSales.sales();this.after();}@Overridepublic void price() {this.realSales.price();}public void before(){System.out.println("sales before");}public void after(){System.out.println("sales after");}
}输出结果:
sales before
Real sales
sales after
Real price
优缺点
优点
- 职责清晰。各司其职,各个角色不用关心非本职的事务
- 高扩展性。具体角色不管怎么变化,都离不开抽象角色的限制,只要代理角色实现了抽象角色的功能,就不用关心具体角色的变化
- 智能化(主要是动态代理)
缺点
- 在客户端和真实角色之间增加了一层逻辑处理,可能会导致请求变慢
- 实现代理需要额外的工作,有些代理的实现还比较复杂
使用场景
- 真实角色不适合暴露出来,可以使用代理对象来进行包装
- 远程代理、虚拟代理、Copy-on-Write 代理、防火墙(Firewall)代理等等很多使用场景
动态代理
动态代理是代理模式中的重头戏,有另外一篇文章专门来讲解动态代理的相关内容
Spring AOP知识准备-动态代理
总结一下
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问
- 代理模式的几种角色
- 抽象角色(AbstractSales)定义了具体的产品
- 真实角色(RealSales)具体的产品实现者
- 代理角色(ProxySales)负责代现RealSeles的所有功能
- 优点
- 职责清晰。各司其职,各个角色不用关心非本职的事务
- 高扩展性。具体角色不管怎么变化,都离不开抽象角色的限制,只要代理角色实现了抽象角色的功能,就不用关心具体角色的变化
- 智能化(主要是动态代理)
- 缺点
- 在客户端和真实角色之间增加了一层逻辑处理,可能会导致请求变慢
- 实现代理需要额外的工作,有些代理的实现还比较复杂
- 使用场景
- 真实角色不适合暴露出来,可以使用代理对象来进行包装
- 远程代理、虚拟代理、Copy-on-Write 代理、防火墙(Firewall)代理等等很多使用场景
- 动态代理是在实现阶段不用关心代理类,而在运行阶段才指定代理的对象
- 一般动态代理有两种实现方式:JDK动态代理、CGLIB动态代理
- JDK动态代理,代理类与真实类实现同一接口,通过代理类实现InvocationHandler并重写invoke方法来进行动态代理的,在invoke方法中实现额外的处理。缺点:只能够代理实现了接口的类
- CGLIB动态代理,生成的代理类继承被代理类,通过实现MethodInterceptor接口并重写intercept方法来实现额外的处理。
缺点:因为要继承,final类以及final方法无法使用CGLIB动态代理
欢迎您关注Java天堂公众号,专注于分享Java相关技术
这篇关于你的代言人-代理模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!