1. 程式人生 > >【設計模式】代理模式:靜態代理,動態代理,spring aop

【設計模式】代理模式:靜態代理,動態代理,spring aop

spring 實現接口 找到 master 代碼 -s result java 統一

代理模式分為靜態代理和動態代理。我們拿鏈家來舉例子,我們本人是真實的對象,有真實的業務需求:需要去找房子;鏈家是中介,是代理類,他來幫我執行找房子的這個操作。

靜態代理:

  1.實現一個接口

public interface SearchHome {
    
    public void search();

}

  2.構建實現接口的委托類

public class Master implements SearchHome {

    @Override
    public void search() {
        System.out.println("尋找房子");
    }

}

  3.構建代理類

public class HomeLink implements SearchHome{
    
    private SearchHome sh;
    
    public HomeLink(SearchHome sh) {
        super();
        this.sh = sh;
    }

    @Override
    public void search() {
        System.out.println("鏈家幫您找房子...");
        sh.search();
        System.out.println(
"鏈家幫您找到了..."); } }

  4.客戶端:

public class Main {
    public static void main(String[] args) {
        SearchHome sh = new HomeLink(new Master());
        sh.search();
    }
}

動態代理:

靜態代理是代理類和委托類在java代碼中綁定在一起,不方便管理。相比靜態代理, 動態代理可以很方便的對委托類的方法進行統一處理。動態代理是在java代碼運行時生成,動態代理又分為jdk動態代理和cglib動態代理。

  1.定義接口:

public interface SearchHome {
    
    void search();
    
}

  2.定義委托類:

public class Master implements SearchHome {

    @Override
    public void search() {
        System.out.println("尋找房子");
    }

}

  3.定義動態代理類

public class MyProxy implements InvocationHandler {
    
    private Object target;
    
    public MyProxy(Object target) {
        super();
        this.target = target;
    }

    public Object newInstance() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.target.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        System.out.println("鏈家開始找...");
        result = method.invoke(this.target, args);
        System.out.println("鏈家開始找...");
        return result;
    }

}

  4.main

public class Main {
    
    public static void main(String[] args) {
        SearchHome sh = (SearchHome) new MyProxy(new Master()).newInstance();
        sh.search();
    }

}

【設計模式】代理模式:靜態代理,動態代理,spring aop