<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>

  • <>代理模式

    給某一個對象提供一個代理,并由代理對象控制對原對象的引用。

    <>角色

    * 抽象主體(Subject)
    代理對象和實際對象的統一性接口
    * 代理者(Proxy)
    包含了對實際主體的引用。
    * 實際主體(RealSubject)
    當代理者無法勝任時,才可由使用者直接操縱
    <>案例

    <>代理打印機

    <>代碼

    Printer:Subject
    public interface Printer { public void setName(String printerName); public
    String getName(); public void print(String content) throws InterruptedException;
    }
    RealPrinter: RealSubject
    public class RealPrinter implements Printer{ private String name; /** *
    定義啟動需要5秒 * @param name * @throws InterruptedException */ public RealPrinter(
    String name) throws InterruptedException { System.out.printf("正在初始化打印機"); Thread
    .sleep(5000); this.name = name; System.out.println("初始化完成"); } @Override public
    void setName(String printerName) { this.name = printerName; } @Override public
    String getName() { return this.name; } @Override public void print(String
    content) { System.out.printf("=== %s ===\n", this.name); System.out.println(
    content); System.out.println("=========="); } }
    PrinterProxy: Proxy
    /** * 代理打印機代理了返回名字的工作,打印工作人需要實際打印機 */ public class PrinterProxy implements
    Printer{ private String name; private RealPrinter realPrinter; public
    PrinterProxy(String name){ setName(name); } @Override public void setName(String
    printerName) { this.name = printerName; if (realPrinter!=null) { realPrinter.
    setName(printerName); } } @Override public String getName() { return name; }
    @Override public void print(String content) throws InterruptedException {
    realize(); realPrinter.print(content); } private synchronized void realize()
    throws InterruptedException { if (realPrinter==null){ realPrinter = new
    RealPrinter(name); } } }
    Main:
    public class Main { public static void main(String[] args) throws
    InterruptedException { Printer printer = new PrinterProxy("Printer"); System.out
    .printf("Printer's name is %s.\n", printer.getName()); printer.print("Hello,
    world!"); } }
    <>剖析

    在這個案例中,使用PrinterProxy有什么優勢?只有在真正需要打印的時候,才會實例化打印機,消耗那5秒,否則即便你不需要打印東西,只需要知道打印機的名字,new一個真打印機也不得不消耗那5秒。

    <>權限控制

    這個案例就不寫代碼了,想象一下即可,假設一個資源作為RealSubject,只有管理員才能訪問,那么通過Proxy訪問時資源時,要額外傳入你的身份令牌,Proxy會先檢驗你的權限,然后再決定是否訪問資源。

    <>應用場景

    * 虛擬代理(Virtual Proxy),用于減輕一個龐大的軟件系統初始化
    * 遠程代理(Remote Proxy),用于遠程調用代理
    * 通道代理(Access Proxy),用于調用RealSubject時的權限控制

    技術
    下載桌面版
    GitHub
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频