天天看點

設計模式之 代理模式(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("我要買房");
  }
}
           

繼續閱讀