代理模式
在我们的现在生活中,我们都会面临买房子的状况,通常我们都会找房地产中介帮忙,在这里房地产中介就起到了一个代理的作用。代理对象可以在客户端和目标对象间起到中介作用,而且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。代理模式是一种很好实现客户对象与代理对象分离的策略。
代理模式的UML图
从UML图中可以看出,Subject类中定义了RealSubject和ProxySubject的共用接口,保证客户端使用的透明性。
一、静态代理
1、Subject接口的实现
public interface BuyHouseService { public void buyHouse(); }
2、真实实体RealSubject类
public class Customer implements BuyHouseService { private String name; private Double money; @Override public void buyHouse() { System.out.println(name + "买房子首付付了:" + money + "元"); } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3、代理Proxy类
public class HouseProxy implements BuyHouseService { private Customer customer; public HouseProxy(Customer customer) { this.customer = customer; } @Override public void buyHouse() { customer.buyHouse(); } }
4、客户端测试类
public static void main(String[] args){ Customer customer = new Customer(); customer.setName("张三"); customer.setMoney(300000D); HouseProxy houseProxy = new HouseProxy(customer); houseProxy.buyHouse(); }
上述代码就是静态代理模式简单实现,代理类实现了一个Subject接口的对象,任何实现该接口的对象,都可以通过代理类进行代理,增加了通用性。但是当需要大量代理类时,系统结构会变得比较臃肿。而且当接口需要修改方法时,不仅其所有实现类需要修改代码,代理类也要修改,程序就会变得复杂和难以维护。
二、动态代理
动态代理是根据代理的对象,动态创建代理类。这样就可以避免静态代理中代理类接口过多的问题。动态代理是实现方式,是通过反射来实现的,借助Java自带的java.lang.reflect.Proxy,通过固定的规则生成。
定义一个动态代理类,实现InvocationHandler接口,具体如下所示:
public class DynamicProxy implements InvocationHandler { Object object;//被代理的实例 public DynamicProxy(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object invoke = method.invoke(object, args); return invoke; } }
客户端实现类:
public static void main(String[] args) { Customer customer = new Customer(); customer.setName("张三"); customer.setMoney(300000D); DynamicProxy proxy = new DynamicProxy(customer); BuyHouseService buyHouseService = (BuyHouseService) Proxy.newProxyInstance(proxy.getClass().getClassLoader(), customer.getClass().getInterfaces(), proxy); buyHouseService.buyHouse(); }
以上就是java代理模式的实现,使用Java动态代理机制大大减少了代码量,增强了系统扩展性。
想要飞得更高,就该忘记地平线!