Jdk的静态代理要求,目标对象和代理对象都要实现相同的接口。然后提供给客户端使用。这个代理对客户端是可见的,其结果图如下:
1、接口
package com.wl.jdk.staticproxy; /** * 接口 */ public interface UserService { public void sayHello(String content); }
2、目标对象
package com.wl.jdk.staticproxy; /** * 实现类(实现接口的目标对象) */ public class UserServiceImpl implements UserService{ public void sayHello(String content) { System.out.println("主人说:" + content); } } }
3、代理类
/** * 目标对象的代理对象,UserServiceImplProxy拥有目标对象的引用 * @version 2016年8月15日下午1:49:55 * @author wuliu */ public class UserServiceImplProxy implements UserService{ private UserService userService; public UserServiceImplProxy(UserService userService) { this.userService = userService; } public void sayHello(String content) { System.out.println("开始......"); userService.sayHello(content); System.out.println("结束......"); } }
4、测试类
package com.wl.jdk.staticproxy; public class Client { public static void main(String[] args) { UserService userService = new UserServiceImplProxy(new UserServiceImpl()); userService.sayHello("早上好!"); } }
装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。