场景描述:
内向男孩送美女礼物,有那心没那胆,只能找代理去送
定义:
为其他对象提供一种代理以控制对这个对象的访问
策略模式结构图:
代理模式结构解析:
- 抽象角色:声明真实对象和代理对象的共同接口
- 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
- 真实对象:代理角色所代表的真实对象,是我们最终要引用的对象。
送礼物抽象对象:
/** * @Description: 送礼物 * @Author: qjc * @Date: 2020/6/5 */ public interface GiveGift { /** * 送鲜花 */ void giveFlowers(); /** * 送巧克力 */ void giveChocolates(); /** * 送衣服 */ void giveClothes(); }
美女实体:
/** * @Description: 美女实体 * @Author: qjc * @Date: 2020/6/5 */ @Data public class BeautyGirl { private String name; }
真实对象:
/** * @Description: 内向男孩儿,不敢给美女送礼物,有那心没那胆 * @Author: qjc * @Date: 2020/6/5 */ public class NeiXiangBoy implements GiveGift { private BeautyGirl beautyGirl; public NeiXiangBoy(BeautyGirl beautyGirl) { this.beautyGirl = beautyGirl; } @Override public void giveFlowers() { System.err.println("给" + beautyGirl.getName() + "送鲜花"); } @Override public void giveChocolates() { System.err.println("给" + beautyGirl.getName() + "送巧克力"); } @Override public void giveClothes() { System.err.println("给" + beautyGirl.getName() + "送衣服"); } }
代理对象:(静态代理)
/** * @Description: 内向男孩儿找了一个代理,代理也得能完成送礼物这件事 * @Author: qjc * @Date: 2020/6/5 */ public class ProxyOfNeiXiangBoy implements GiveGift { private NeiXiangBoy neiXiangBoy; public ProxyOfNeiXiangBoy(BeautyGirl beautyGirl) { this.neiXiangBoy = new NeiXiangBoy(beautyGirl); } //代理给美女送花 @Override public void giveFlowers() { //其实是内向男孩儿给美女送花 neiXiangBoy.giveFlowers(); } @Override public void giveChocolates() { neiXiangBoy.giveChocolates(); } @Override public void giveClothes() { neiXiangBoy.giveFlowers(); } }
静态代理模式测试类:
public class ProxyModeTest { public static void main(String[] args) { BeautyGirl beautyGirl = new BeautyGirl(); beautyGirl.setName("翠花"); DaiLiOfNeiXiangBoy daiLiOfNeiXiangBoy = new DaiLiOfNeiXiangBoy(beautyGirl); daiLiOfNeiXiangBoy.giveChocolates(); daiLiOfNeiXiangBoy.giveClothes(); daiLiOfNeiXiangBoy.giveFlowers(); } }
动态代理角色处理器
/** * @Description: 代理角色处理器 * @Author: qjc * @Date: 2020/6/6 */ public class ProxyHandler implements InvocationHandler { private NeiXiangBoy neiXiangBoy; public ProxyHandler(NeiXiangBoy neiXiangBoy) { this.neiXiangBoy = neiXiangBoy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.err.println("方法开始前做一些事情"); //激活调用的方法 Object object = method.invoke(neiXiangBoy, args); //方法结束后做一些事情 System.err.println("方法结束后做一些事情"); return object; } }
动态代理模式测试类
/** * @Description: 动态代理模式测试类 * @Author: qjc * @Date: 2020/6/5 */ public class DynamicProxyModeTest { public static void main(String[] args) { BeautyGirl beautyGirl = new BeautyGirl(); beautyGirl.setName("翠花"); NeiXiangBoy neiXiangBoy = new NeiXiangBoy(beautyGirl); ProxyHandler proxyHandler = new ProxyHandler(neiXiangBoy); GiveGift giveGift = (GiveGift) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{GiveGift.class}, proxyHandler); giveGift.giveChocolates(); giveGift.giveFlowers(); giveGift.giveClothes(); } }