设计模式之代理模式
文章目录
- 设计模式之代理模式
- 一、代理模式是什么?
- 二、代理模式详解
-
- 1.代理模式组成
- 2.示例demo
-
- (1)、静态代理
- (2)、动态代理
- 总结
-
- 优点
- 缺点
- 静态代理和动态代理的区别
一、代理模式是什么?
代理模式由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
举个例子:过年回家需要买票,现在网上购票不只是12306了,也可以在美团等软件APP上面购买,美团就是代理,相当于我们与车票之间的中介。
二、代理模式详解
1.代理模式组成
代理模式的主要角色:
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
2.示例demo
代理模式分为静态代理和动态代理。
(1)、静态代理
public interface Ticket {
void buy();
}
//这是12306网站、AAA网站的票、BBB网站的票
public class RealTicket implements Ticket {
@Override
public void buy() {
System.out.println("买了一张车票");
}
}
//买票代理类,相当于美团
public class ProxyTicket implements Ticket{
//买票调用了12306的接口
private RealTicket realTicket = new RealTicket();;
@Override
public void buy() {
preBuy();
realTicket.buy();
afterBuy();
}
/*买票前*/
public void preBuy(){
System.out.println("检查是否有票");
}
/*买票后*/
public void afterBuy(){
System.out.println("票的数量减一");
}
}
public class Test{
/*测试demo*/
public static void main(String[] args) {
ProxyTicket meiTuan = new ProxyTicket();
meiTuan.buy();
}
}
上面举的例子仅仅是个举例,不代表实际情况。
静态代理可以在不修改目标对象功能的前提下,通过Proxy代理类对目标功能进行扩展,但是静态代理不够灵活。
(2)、动态代理
貌似举的例子翻车了,因为下面动态代理代理类是一个,可以代理多个实现类。暂且理解为美团卖的不只是12306的票,还有电影票、饭票等。
public interface Ticket {
void buy();
}
//这是12306网站、AAA网站的票、BBB网站的票
public class RealTicket implements Ticket {
@Override
public void buy() {
System.out.println("买了一张车票");
}
}
//代理类,不需要时限Ticket接口,所以代理类只需要一个,代理对象可以多个
public class JdkTicket implements InvocationHandler {
private Ticket target;
/*通过反射来获取当前的代理类*/
public Ticket getInstance(Ticket ticket){
this.target = ticket;
Class<?> clazz = target.getClass();
return (Ticket) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
}
/*执行具体方法*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(this.target, args);
after();
return result;
}
private void before() {
System.out.println("检查是否有票");
}
private void after() {
System.out.println("票的数量减一");
}
}
public class Test{
/*测试demo*/
public static void main(String[] args) {
JdkTicket jdkTicket = new JdkTicket(); //代理类
Ticket instance = jdkTicket.getInstance(new RealTicket()); //代理12306
instance.buy();
}
}
这就是动态代理,静态代理需要每个实际对象创建一个代理类,而动态代理一个代理类可以代理多个被代理对象
总结
优点
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能;
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
缺点
- 代理模式会造成系统设计中类的数量增加;
- 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
- 增加了系统的复杂度;
静态代理和动态代理的区别
- 静态代理只能通过手动完成代理操作,如果被代理类增加了新的方法,则代理类需要同步增加,违背开闭原则。
- 动态代理采用在运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开闭原则。
- 若动态代理要对目标类的增强逻辑进行扩展,结合策略模式,只需要新增策略类便可完成,无需修改代理类的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/3417.html