1. 程式人生 > 其它 >java代理設計模式

java代理設計模式

技術標籤:設計模式設計模式

目錄

代理模式概述

代理(Proxy)是一種設計模式,提供了間接對目標物件進行訪問的方式;即通過代理物件訪問目標物件.這樣做的好處是:可以在目標物件實現的功能上,增加額外的功能補充,即擴充套件目標物件的功能.

這就符合了設計模式的開閉原則,即在對既有程式碼不改動的情況下進行功能的擴充套件。

舉個例子來說明代理的作用:明星與經紀人之間就是被代理和代理的關係,明星出演活動的時候,明星就是一個目標物件,他只要負責活動中的節目,而其他瑣碎的事情就交給他的代理人(經紀人)來解決.這就是代理思想在現實中的一個例子。

靜態代理

在使用靜態代理時,被代理物件與代理物件需要一起實現相同的介面或者是繼承相同父類,因此要定義一個介面或抽象類.

程式碼案例:

package com.fan.domain3;
//①:歌星的介面
 interface IStar {
    void confer();//面談

    void signContract();//籤合同

    void sing();//唱歌

    void last();//善後工作
}

//②:被代理類:真實物件
class RealStar implements IStar{
    //除了唱歌方法自己有具體實現外,其他都是空實現

    public void confer() {

    }

    public void signContract() {

    }

    //唱歌自己唱
    public void sing() {
        System.out.println("張韶涵唱歌");
    }

    public void last() {

    }
}

//③: 代理類:也就是經紀人;代理類需要有真實物件的控制權 (引用),即經紀人對歌星有一定的控制權
class Proxy implements IStar {
    //真實物件的引用,即你要幫誰代理(包含被代理人)
    private IStar star;//介面型別

    public Proxy() {
        super();
    }

    public Proxy(IStar star) {
        super();
        this.star = star;
    }

    public void confer() {
        System.out.println("經紀人面談");
    }

    public void signContract() {
        System.out.println("經紀人籤合同");
    }

    public void sing() {
        //注意這裡不是代理人幹核心業務(非經紀人唱歌),而是呼叫真實物件的方法
        star.sing();
    }

    public void last() {
        System.out.println("經紀人善後工作");
    }
}

public class Test01{
    public static void main(String[]args){
        //建立明星物件(被代理物件) 和經紀人(代理物件)
        IStar realStar = new RealStar();
        Proxy proxy = new Proxy(realStar);
        proxy.confer();//經紀人面談
        proxy.signContract();//經紀人籤合同
        proxy.sing();//表象代理人唱歌,本質是歌星唱歌//張韶涵唱歌
        proxy.last();//經紀人善後工作
    }
}

執行結果:

經紀人面談
經紀人籤合同
張韶涵唱歌
經紀人善後工作

靜態代理總結:
程式碼中注意:
第一點:代理類和被代理類都實現同一個介面,表示兩個類都是為了完成同一件事/功能(此功能/方法是抽象的,由實現類具體去實現)。

第二點:代理類 擁有 被代理類的 引用,以便對代理類進行其方法的呼叫。因為核心的業務邏輯不能由代理類完成,不安全或者沒那種能力完成。

優點:可以做到在不修改目標物件的功能前提下,對目標功能擴充套件.
缺點:

因為代理物件需要與目標物件實現一樣的介面,所以會有很多代理類,類太多.同時,一旦介面增加方法,目標物件與代理物件都要維護.

而動態代理方式可以解決上面的問題