设计模式——代理模式
代理模式应用场景一般是控制对象的访问权限,有时用于为对象增加功能。
与装饰模式的区别是,装饰模式增加的功能一般是特殊功能,而代理模式增加的功能是通用功能;同时,在实现上,一般代理模式中,被代理对象是在代理对象中创建的,而装饰模式中被装饰对象是通过构造函数从外部传入到装饰者中的。
装饰模式一般使用抽象类继承实现对被装饰者的调用。代理模式使用的是被代理类作为代理类的成员。
代理模式分为:远程代理、保护代理(主要用于控制被代理对象的访问权限),虚拟代理(用于延迟对象的创建),装饰代理(添加通用的功能)
通常也将代理模式分为静态代理和动态代理;
静态代理一般是一对一代理,一个代理对象对应一个委托类(被代理对象)
下面看代码,以黄牛代理卖票为例:
首先定义卖票接口:
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.Proxy; /** * @description * @author panteng * @date 17-2-13. */ public interface SellTicket { void sellTicket(); }
定义车站(实际卖票处,需要实现卖票接口)
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.Proxy; /** * @description * @author panteng * @date 17-2-13. */ public class BusStation implements SellTicket { public void sellTicket(){ System.out.println("出一张票"); } public void sellStudentTicket(){ System.out.println("出售一张学生票"); } public void sellChildrenTicket(){ System.out.println("出售一张儿童票"); } }
定义黄牛(代理类,需要实现卖票接口)
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.Proxy; /** * @description * @author panteng * @date 17-2-13. */ public class ScalpersProxy implements SellTicket { BusStation busStation; ScalpersProxy(){ busStation = new BusStation(); } public void sellTicket(){ busStation.sellTicket(); System.out.println("加价"); } public void sellTicket(String type){ if ("儿童".equals(type)) { busStation.sellChildrenTicket(); System.out.println("加一点价"); } else if ("学生".equals(type)) { busStation.sellStudentTicket(); System.out.println("加多一点价"); } else { this.sellTicket(); } } }
/* * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved */ package com.pt.Proxy; import org.junit.Test; /** * @description * @author panteng * @date 17-2-13. */ public class ScalpersProxyTest { @Test public void proxyTest(){ ScalpersProxy proxy = new ScalpersProxy(); proxy.sellTicket(); proxy.sellTicket("儿童"); } }
对于通用框架一般使用动态代理,为委托类增加通用功能!
Java动态代理相关文章之前已有总结: