天天看点

设计模式之 代理模式(demo)

代理模式的原理(静态/动态)

代理实现:

1.静态代理:
              带理者只能实现一种被代理的需求
    2.动态代理:
              <1>可以实现针对被代理需求的多种代理

              <2>需要实现 InvocationHandler接口

              <3>利用反射传入的类加载器 来改变代理方法 动态传入代理加载类
           

一、静态代理模式

//如下实现对静态代理的测试

public class TestProxy {
   `@Test
    public void testStaticProxy() {
        ProxyImpl im = new ProxyImpl();

        Proxy2 p2=new Proxy2();
        PersonProxy pp = new PersonProxy(p2);
        pp.action();
      }
}
           

//代理和被代理都实现的共同接口如下:

interface Person{
    void action();
 }
           

//代理者类实现如下:

class PersonProxy implements Person{
    Person p;
    public PersonProxy(Person p){
        this.p=p;//将 顾客(被代理人)的资料告诉代理人
    }

    @Override
    public void action() {
        System.out.println("开始代理工作");

        p.action();//执行 顾客要求的代理工作

        System.out.println("结束代理工作");
    }
}

           

//被代理者1——买车实现如下:

class ProxyImpl implements Person{
    @Override
    public void action() {
        System.out.println("我要买" +"车");

    }
}
           

//被代理类2代理买房实现如下:

class Proxy2 implements Person{

@Override
public void action() {
    System.out.println("我要买房……");
  }
}
           

二、动态代理实现如下:

测试代理方法:

//测试代理运行 模块如下:

`@Test
public void testDynamicProxy() {

    Person person = new Customer1();
    /**
     * 参数1: 代理人对象使用的类加载器 参数2:代理人对象 实现的接口 参数3: 被代理人对象
     * 
     * */
    Person p = (Person) Proxy.newProxyInstance(person.getClass()
            .getClassLoader(), person.getClass().getInterfaces(),
            new Clerk(person));
    p.doWork();
}
}
           

// 包含所有代理类的工厂(类似于中介可代理多种买车 买房 ……)

class Clerk implements InvocationHandler {
Person person;// 被代理人

public Clerk(Person person) {
    this.person = person;
}

/**
 * 参数1:被代理对象 参数 2:被代理对象要代理的业务——买房或买车 参数 3:被代理对象要执行的方法的对应参数
 * 
 * 返回:代理人对象
 */
@Override
public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {

    System.out.println("-----开始代理工作------");
    Object invoke = method.invoke(person, args);

    System.out.println("-----结束代理工作-------");
    return invoke;
   }
}
           

//共同实现的接口

interface Person {
void doWork();
}
           

//被代理对象1

class Customer1 implements Person {
@Override
public void doWork() {
    System.out.println("我要买车");
  }
}
           

//被代理对象2

class Customer implements Person {
@Override
public void doWork() {
    System.out.println("我要买房");
  }
}
           

继续阅读