<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Swing


    天行健 君子以自強不息

    posts - 69, comments - 215, trackbacks - 0, articles - 16
       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    設計模式:結構模式之Proxy(代理)

    Posted on 2007-06-04 10:57 zht 閱讀(460) 評論(0)  編輯  收藏 所屬分類: 設計模式

    Proxy是比較有用途的一種模式,而且變種較多,應用場合覆蓋從小結構到整個系統的大結構,Proxy是代理的意思,我們也許有代理服務器等概念,代理概念可以解釋為:在出發點到目的地之間有一道中間層,意為代理.

    設計模式中定義: 為其他對象提供一種代理以控制對這個對象的訪問.要用再建立
    程序舉例1:權限訪問

    public class ForumProxy implements Forum {

    private ForumPermissions permissions;
    private Forum forum;
    this.authorization = authorization;

    public ForumProxy(Forum forum, Authorization authorization,
    ForumPermissions permissions)
    {
    this.forum = forum;
    this.authorization = authorization;
    this.permissions = permissions;
    }

    .....

    public void setName(String name) throws UnauthorizedException,
    ForumAlreadyExistsException
    {
      //只有是系統或論壇管理者才可以修改名稱
      if (permissions.isSystemOrForumAdmin()) {
        forum.setName(name);
      }
      else {
        throw new UnauthorizedException();
      }
    }

    ...

    }

    DbForum才是接口Forum的真正實現,以修改論壇名稱為例:

    public class DbForum implements Forum, Cacheable {
    ...

    public void setName(String name) throws ForumAlreadyExistsException {

      ....

      this.name = name;
      //這里真正將新名稱保存到數據庫中
      saveToDb();

      ....
    }


    ...

    }


    凡是涉及到對論壇名稱修改這一事件,其他程序都首先得和ForumProxy打交道,由ForumProxy決定是否有權限做某一樣事情,ForumProxy是個名副其實的"網關","安全代理系統".
    程序舉例2:用到才創建
    實際執行打印 為了模仿長時間操作 在構建的時候延遲5S
    public class Printer implements Printable {
     private String name;

     public Printer() {
      heavyJob("正在產生Printer的對象實例");
     }

     public Printer(String name) { // 構造子
      this.name = name;
      heavyJob("正在產生Printer的對象實例(" + name + ")");
     }

     public void setPrinterName(String name) { // 命名
      this.name = name;
     }

     public String getPrinterName() { // 取得名稱
      return name;
     }

     public void print(String string) { // 輸出名稱
      System.out.println("=== " + name + " ===");
      System.out.println(string);
     }

     private void heavyJob(String msg) { // 較重的工作(假設)
      System.out.print(msg);
      for (int i = 0; i < 5; i++) {
       try {
        Thread.sleep(1000);
       } catch (InterruptedException e) {
       }
       System.out.print(".");
      }
      System.out.println("完成。");
     }
    }
    代理類:真正要打印了才去調用生成printer并且參數賦值進行打印操作
    public class PrinterProxy implements Printable {
     private String name; // 名稱

     private Printable real; // 「本人」

     private String className; // 「本人」的類名稱

     public PrinterProxy(String name, String className) { // 構造子
      this.name = name;
      this.className = className;
     }

     public synchronized void setPrinterName(String name) { // 命名
      if (real != null) {
       real.setPrinterName(name); //「本人」也要命名
      }
      this.name = name;
     }

     public String getPrinterName() { // 取得名稱
      return name;
     }

     public void print(String string) { // 輸出到畫面上
      realize();
      real.print(string);
     }

     private synchronized void realize() { // 產生「本人」
      if (real == null) {
       try {
        real = (Printable) Class.forName("Proxy." + className)
          .newInstance();
        real.setPrinterName(name);
       } catch (ClassNotFoundException e) {
        System.err.println("找不到類 " + className + "。");
       } catch (Exception e) {
        e.printStackTrace();
       }
      }
     }
    }
    無論怎么調用setPrinterName方法都不會產生real實例 只有真正需要生成本人的時候才會生成
    測試方法:
    public class Main {
     public static void main(String[] args) {
      Printable p = new PrinterProxy("Alice", "Printer");
      System.out.println("現在的名稱是" + p.getPrinterName() + "。");
      p.setPrinterName("Bob");
    //不會生成Printer
      System.out.println("現在的名稱是" + p.getPrinterName() + "。");
    //不會生成Printer
      p.print("Hello, world.");
    //生成Printer
     }
    }

    主站蜘蛛池模板: 日韩精品无码免费专区网站| 91精品手机国产免费| 免费一级一片一毛片| 亚洲精品乱码久久久久久按摩 | 高清一区二区三区免费视频| 最近免费中文字幕大全视频| 亚洲深深色噜噜狠狠网站| 永久免费AV无码国产网站 | 在线精品免费视频| 亚洲精品无码永久在线观看男男| 日韩一区二区a片免费观看| 亚洲AV无码日韩AV无码导航| 亚洲AV成人无码网天堂| 国产在线观看免费完整版中文版 | 亚洲中文字幕第一页在线| 亚洲精品乱码久久久久蜜桃| 在线视频免费国产成人| 亚洲一区在线免费观看| 日韩激情无码免费毛片| 一个人看的www免费高清| 免费萌白酱国产一区二区| 免费手机在线看片| 亚洲欧洲∨国产一区二区三区| 午夜免费福利小电影| 2020年亚洲天天爽天天噜| 亚洲黄色免费网址| 亚洲一区二区三区电影| 中文在线观看国语高清免费| 亚洲av不卡一区二区三区| 毛片免费在线视频| 成人自慰女黄网站免费大全| 日木av无码专区亚洲av毛片| 午夜色a大片在线观看免费| aaa毛片免费观看| 亚洲免费福利在线视频| 亚洲综合激情另类专区| 一级毛片试看60分钟免费播放| 国产精品亚洲A∨天堂不卡 | 成人免费午夜在线观看| EEUSS影院WWW在线观看免费| 最新国产AV无码专区亚洲|