1. 目的
为其他对象提供一种代理以控制对这个对象的访问。
2. 什么是代理
它使用代理对象完成用户请求,屏蔽用户对真实对象的访问
3. 解决什么问题
在直接访问对象时带来的问题
4. 如何解决
增加中间层
5. 何时使用
想在访问一个类时做一些控制。
6. 好处
1、职责清晰。 2、高扩展性。 3、智能化
7. 角色分配
角色 | 作用 |
---|---|
主题接口 | 定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法 |
真实主题 | 真实实现业务逻辑的类 |
代理类 | 用来代理和封装真实主题 |
Main | 客户端,使用代理类和主题接口完成一些工作 |
8. 代码清单
package com.one.design;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Proxy {
}
/**
* 主题接口
*
*/
interface Account {
void addAccount(String name);
}
/**
* 主题接口的实现类
*
*/
class AccountImpl implements Account {
@Override
public void addAccount(String name) {
System.out.println("add acount be success{}:"+name);
}
}
/**
* 处理类
* @author Administrator
*
*/
class ProxyAccount implements InvocationHandler {
private Object target;
public Object bind(Object target) {
this.target = target;
System.out.println(target.getClass().getInterfaces()[0].getName());
//获取代理类
return java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] arg)
throws Throwable {
Object result = null;
result = method.invoke(target, arg);
return result;
}
}
/**
* 测试类
*
*/
class TestProxyAccount {
public static void main(String[] args) {
ProxyAccount proxyAccount = new ProxyAccount();
Account object = (Account)proxyAccount.bind(new AccountImpl());
object.addAccount("zhang san");
}
}