1. 程式人生 > 實用技巧 >靜態代理模式

靜態代理模式

代理模式三要素

  • 共同的介面
  • 被代理的真實角色
  • 代理角色

比如老王被綠了,要離婚,他找了一個代理律師幫他打官司

那麼老王和律師的共同目的就是老王離婚,離婚可以抽象成一個共同的介面

老王要打官司離婚,所以老王是被代理的真實角色

代理律師是幫老王離婚,代理律師是一個代理角色

首先定義一個介面

// 定義一個離婚介面
public interface Divorce {
    // 定義一個打官司的方法,通過打官司的方式離婚
    void lawsuit();
}

定義一個真實角色類

// 定義一個真是角色,男人類,實現離婚介面
public class Man implements Divorce {
    private String name; // 這個人有姓名

    public Man(String name) {
        this.name = name;
        System.out.println("有一個人叫" + this.name + "!");
    }

    public String getName() {
        return name;
    }

    @Override
    public void lawsuit() {
        System.out.println(this.name + "打贏官司離婚了!");
    }
}

定義一個代理角色類

// 定義一個代理角色,律師類,實現離婚介面
public class Lawyer implements Divorce {
    private Man man; // 律師要知道幫誰離婚

    public Lawyer(Man man) {
        this.man = man;
        System.out.println(this.man.getName() + "找到了律師!");
    }

    // 律師可以打離婚官司,但是律師是幫別人打離婚官司
    @Override
    public void lawsuit() {
        // 律師打官司前要蒐集證據
        this.before();
        // 律師幫老王離婚
        this.man.lawsuit();
        // 律師打官司後要收錢
        this.after();
    }

    // 律師打官司前要蒐集證據
    private void before() {
        System.out.println("律師打官司前蒐集證據!");
    }

    // 律師打官司後要收錢
    private void after() {
        System.out.println("律師打官司後收錢!");
    }
}

測試程式碼

// 測試程式碼
public static void main(String[] args) {
    // 建立一個真實物件老王
    Man wang = new Man("老王");
    // 老王找了一個律師
    Lawyer lawyer = new Lawyer(wang);
    // 律師幫老王打官司
    lawyer.lawsuit();
}

執行結果

有一個人叫老王!
老王找到了律師!
律師打官司前蒐集證據!
老王打贏官司離婚了!
律師打官司後收錢!

代理模式可以在執行業務程式碼前後進行一些其他的操作