1. 程式人生 > >設計模式之禪學習筆記08--代理模式

設計模式之禪學習筆記08--代理模式

1.代理模式

    是一個使用率非常高的模式。代理模式也叫委託模式,他是為其他物件提供一種代理以控制對這個物件的訪問

    類圖:代理主題角色和具體的主題角色具有相同的抽象主題介面

                                   

   Subject抽象主題角色:

     抽象主題類可以是抽象類也可以是介面,是一個最普通的業務型別定義,無特殊要求。

  RealSubject具體主題角色:

    也叫做被委託角色、被代理角色。它才是冤大頭,是業務邏輯的具體執行者。

  Proxy代理主題角色:

     也叫做委託類、代理類。它負責對真實角色的應用,把所有抽象主題類定義的方法限制。委託給真實主題角色實現,並且在真實主題角色處理完畢前後做預處理和善後處理工作。

  2.舉個例子

    建立一個抽象主題類,常用的是介面

package com.wx.proxypattern.base;
/*
  Subject抽象主題角色:
  抽象主題類可以是抽象類也可以是介面,是一個最普通的業務型別定義,無特殊要求
 */
public interface Subject {
    public  void request();
}

 建立一個具體主題類,也叫委託類,實現抽象主題類。

package com.wx.proxypattern.imp;

import com.wx.proxypattern.base.Subject;
/*
也叫做被委託角色、被代理角色。是業務邏輯的具體執行者。
 */
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("需要被代理的角色");
    }
}

 建立一個代理主題角色SubjectProxy,實現抽象主題介面。並通過建構函式來傳遞代理者。

package com.wx.proxypattern.imp;
import com.wx.proxypattern.base.Subject;
/*
  代理主題角色
 */
public class SubjectProxy implements Subject {
    //要代理哪個實現類
    private Subject subject=null;
    //被預設代理者
    public SubjectProxy()
    {

        this.subject=new RealSubject();
    }
    //通過建構函式傳遞代理者
    public SubjectProxy(Subject subject)
    {

        this.subject=subject;
    }
    @Override
    public void request() {
        this.before();
        this.subject.request();
        this.after();
    }
    //預處理
    public void before()
    {
           System.out.println("預處理");
    }
    //善後處理
    public void after()
    {
           System.out.println("善後處理");
    }
}

 測試:

package com.wx.proxypattern.test;

import com.wx.proxypattern.base.Subject;
import com.wx.proxypattern.imp.SubjectProxy;
import com.wx.proxypattern.imp.RealSubject;

public class TestProxy {
    public static void main(String[] args)
    {
        Subject subject=new RealSubject();
        SubjectProxy proxy = new SubjectProxy(subject);
        proxy.request();
    }
}

代理模式的優點:

職責清晰

真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理

完成一件事務,附帶的結果就是程式設計簡潔清晰。

高擴充套件性

具體主題角色是隨時都會發生變化的,只要它實現了介面,甭管它如何變化,都逃不脫如來佛的手掌(介面),那我們的代理類完全就可以在不做任何修改的情況下使用。