Java设计模式之代理
2021/9/10 11:05:11
本文主要是介绍Java设计模式之代理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
代理模式从业务上讲其实还是比较好理解的,比如过年我想买一张火车票,总也买不到,怎么办?
比如可以让男朋友去火车站排队去买!这叫静态代理
一、静态代理
首先我们定义一个接口,买火车票
public interface BuyTicket { public void buy(); }
然有个美女,想要回家,需要买一张火车票
public class BuyTicketGirl implements BuyTicket { @Override public void buy() { System.out.println("I need a ticket"); } }
很遗憾,过年的时候火车票不好买,美女只好求男朋友去帮忙买
public class BuyTicketBoy implements BuyTicket { private BuyTicket buyTicket; public BuyTicketBoy(BuyTicket buyTicket) { this.buyTicket = buyTicket; } @Override public void buy() { System.out.println("I am boy friend"); buyTicket.buy(); } }
public class Main { public static void main(String[] args) { BuyTicket buyTicket = new BuyTicketGirl(); BuyTicket proxy = new BuyTicketBoy(buyTicket); proxy.buy(); } }
买到了,输出:
I am boy friend I need a ticket
很好,但这有一个问题,如果让男朋友帮忙买票,前提是每个人都有男朋友,显然这并不现实。
这也是静态代理的缺点:代理只能为一个类服务,如果需要为很多类服务,需要写很多代理类,这并不是我们想看到的。
那怎么办?
如果你去过火车站,会发现火车站就会有一些到处晃悠的大哥悄没声问:买票不?
对于买票这个行为来说,他的身份就是代理,他能帮我完成买票这个行为,具体他是谁,怎么做到,我不关心。
而且在买票这个事上,他能帮很多人实现梦想。这就是动态代理。
二、动态代理
首先我们先实现一个买票大哥,他持有一个object属性,意味他可以为所有人帮忙买票,如果你需要,说不定还可以帮忙买房买车。
public class ProxyHandler implements InvocationHandler { private Object object; public ProxyHandler(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("I am Dynamic Proxy"); method.invoke(object,args); return null; } }
开始买票
public class Main { public static void main(String[] args) { BuyTicket buyTicket = new BuyTicketGirl(); ProxyHandler proxyHandler = new ProxyHandler(buyTicket); BuyTicket proxyInstance = (BuyTicket) Proxy.newProxyInstance( buyTicket.getClass().getClassLoader(), buyTicket.getClass().getInterfaces(), proxyHandler); proxyInstance.buy(); } }
输出:
I am Dynamic Proxy I need a ticket
也买到票了,这就是动态代理
这篇关于Java设计模式之代理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-28MQ底层原理资料详解:新手入门教程
- 2024-11-28MQ项目开发资料详解:新手入门教程
- 2024-11-28MQ项目开发资料详解:入门与初级用户指南
- 2024-11-28MQ消息队列资料入门教程
- 2024-11-28MQ消息队列资料:新手入门详解
- 2024-11-28MQ消息中间件资料详解与应用教程
- 2024-11-28MQ消息中间件资料入门教程
- 2024-11-28MQ源码资料详解与入门教程
- 2024-11-28MQ源码资料入门教程
- 2024-11-28RocketMQ底层原理资料详解