1. 程式人生 > 資訊 >庫克:iPhone 在印度只佔很少的份額,蘋果將開設零售店來搶佔市場

庫克:iPhone 在印度只佔很少的份額,蘋果將開設零售店來搶佔市場

代理模式

典型應用場景 房東 中介 租房者,中介就作為房東的代理與租房者溝通,提供附加訊息

  • 靜態代理模式,每個房東都必須建立一個代理類,實現簡單但是程式碼冗餘重複很多
  1. 租房介面實現
package com.gof23.proxy1.demo1;

public interface Rent {
    void zf();
}
  1. 房東實現租房介面
package com.gof23.proxy1.demo1;

public class Host implements Rent {
    public void zf(){
        System.out.println("我要租房");
    }
}
  1. 代理實現租房介面同時組合租房介面
package com.gof23.proxy1.demo1;

public class Proxy implements Rent{
    private Rent rent;
    public void setRent(Rent rent){
        this.rent = rent;
    }
    @Override
    public void zf() {
        rent.zf();
    }
}
  1. 租客租房測試
package com.gof23.proxy1.demo1;

public class Client {
    public static void main(String[] args) {
        Host host = new Host();
        Proxy proxy = new Proxy();
        proxy.setRent(host);
        proxy.zf();
    }
}
  • jdk動態代理模式,實現動態代理,對所有的代理物件只要一個代理類
  1. 動態代理類
package com.gof23.proxy1.demo2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyVocationHandler implements InvocationHandler {
    private Object target;
    public void setTarget(Object obj){
        this.target = obj;
    }

    public Object getProxy(){
       return Proxy.newProxyInstance(this.getClass().getClassLoader(),
               target.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target,args);
    }
}
  1. 租客實現租房
package com.gof23.proxy1.demo2;

public class Client {
    public static void main(String[] args) {
        Host host = new Host();
        ProxyVocationHandler proxyVocationHandler = new ProxyVocationHandler();
        proxyVocationHandler.setTarget(host);
        Rent rent = (Rent)proxyVocationHandler.getProxy();
        rent.zf();
    }
}

小結: 動態代理相當重要,大部分框架底層都會用到動態代理,有spring、mybatis等,動態代理實現可以作為你的工具類