代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,比如生活中,去找房子,中介代理了房东的功能,你只要找中介就能满足你的需求
起源
为了减少耦合性,减少代码的复杂性,引入代理,同时增加对访问的可操作的,增加了代理模式
成员
- 抽象角色:指代理角色和真实角色对外提供的公共方法,一般为一个接口
- 代理对象:需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附 加自己的操作。将统一的流程控制都放到代理角色中处理!
- 真实对象::需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。也就是真正的业 务逻辑在此。
- 静态代理:一般是一对一的的存在也可能是一对多的存在,但是一对多的时候代码量增加不利于维护
- 动态代理:妳补静态的一对多的缺陷,可以更好的对对象代理
使用
- 静态代理使用
public interface Meassage {
void wash();
}
public class service implements Meassage {
@Override
public void wash() {
System.out.println("我干的");
}
}
class Clinet implements Meassage{
Meassage meassage;
public Clinet(Meassage meassage) {
this.meassage = meassage;
}
@Override
public void wash() {
System.out.println("我是代理");
meassage.wash();
}
}
public static void main(String[] args) {
Meassage meassage =new service();
Clinet clinet =new Clinet(meassage);
clinet.wash();
}
- 动态代理 在运行时再创建代理类和其实例,因此显然效率更低。要完成这个场景,需要在运行期动态创建一个Class。JDK提 供了 Proxy 来完成这件事情(也是用到Java 的反射)。基本使用如下:
//抽象角色
interface Ap{
void test(String a);
}
//真实角色
class ApiImpl{
@Override
public void test(String a)
{
System.out.println("真实实现:" + a); }
}
//创建真实角色实例
ApiImpl api = new ApiImpl();
//JDK动态代理:
Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{Api.class},
//JDK实现只能代理接口
\ new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行真实对象方法
return method.invoke(api, args); } });