天天看點

設計模式之代理模式( 一:靜态代理)

設計模式之:代理模式

1.靜态代理模式

靜态代理的概念:例如我們拿一個看電影的步驟用來比拟代理模式,首先我們客戶看電影無非兩種方式,去電影院看和在手機APP上看,兩種浏覽方式都達到了靜态代理的實作,無非就是使用者通過媒體去達到通路對象的目的,那麼我們舉例一個看電影的流程:首先我想看電影,我選擇去電影院看,而到了電影院,前台詢問我要看什麼電影就購買什麼樣的電影票,好,我們拿到心怡的電影票之後經過電影票上的編号去到對應的放映室,再找到對應的座位,這個時候電影開始播放了,我們看電影的目的達到了對吧,隻是我們通過電影院這個媒介了,并且這個媒介給我們提供了一些服務,例如可樂,爆米花,舒适的座椅,溫馨的環境,接下來我們将這些步驟用代碼來實作:

靜态代理代碼實作

播放電影需要放映機

//放映機
public interface SheYing {
    void shoot();//播放
}
           

放映機需要對應膠卷播放:

//膠卷
public class JuZu implements SheYing{
    public void shoot() {
        System.out.println("唐人街電影膠卷已裝配");
    }
}
           

電影院将這些籠絡到一起實作成一個步驟并提供其餘服務

//電影院
public class DianYingYuan {
    private JuZu juzu;

    //日志檔案(提供的服務)
    public DianYingYuan(JuZu juzu) {
         log("唐人街");
        this.juzu = juzu;
    }

    public JuZu getJuzu() {
        return juzu;
    }

    public void log(String msg){
        System.out.println("熒幕開始放映:"+msg+"預告片");
    }

    public void setJuzu(JuZu juzu) {
        this.juzu = juzu;
    }
}
           

觀衆通過電影院來觀看電影

//觀衆
public class GuanZho {
    public static void main(String[] args) {
        //建立電影類對象,傳遞我想看的電影對象
        DianYingYuan ying = new DianYingYuan(new JuZu());
        ying.getJuzu().shoot();
    }
}
           

最終實作結果:

熒幕開始放映:唐人街預告片
唐人街電影膠卷已裝配
           

隻拿一個電影來比例可能還展現不出他的優勢劣勢在哪,那麼我們再新增一個電影類

  • 1.建立類
  • public class Film  {
        
    }
               
  • 2.實作播放接口并寫下執行方法體
  • public class Film  implements SheYing{
    
        public void shoot() {
            System.out.println("綠皮書電影膠卷已裝配");
        }
    }
               
  • 3.在媒介中添加所需的功能,例如我隻添加一個日志功能
  • //電影院(媒介)
    public class DianYingYuan {
        private JuZu juzu;
        private Film film;
    
        //日志檔案
        public DianYingYuan(JuZu juzu) {
             log("唐人街");
            this.juzu = juzu;
        }
    
        public DianYingYuan(Film film){
            log("綠皮書");
            this.film = film;
        }
    
        public JuZu getJuzu() {
            return juzu;
        }
        
        public Film getFilm() {
            return film;
        }
    
        public void log(String msg){
            System.out.println("熒幕開始放映:"+msg+"預告片");
        }
    
        public void setFilm(Film film) {
            this.film = film;
        }
        
        public void setJuzu(JuZu juzu) {
            this.juzu = juzu;
        }
    }
               
  • 4.觀衆實作類同樣更改
  • //觀衆
    public class GuanZho {
        public static void main(String[] args) {
            DianYingYuan ying = new DianYingYuan(new JuZu());
            ying.getJuzu().shoot();
            System.out.println("----------------------------");
            DianYingYuan film = new DianYingYuan(new Film());
            film.getFilm().shoot();
        }
    }
               
  • 實作結果:
  • 熒幕開始放映:唐人街預告片
    唐人街電影膠卷已裝配
    ----------------------------
    熒幕開始放映:綠皮書預告片
    綠皮書電影膠卷已裝配
               

做出總結:

優勢:
  • 我們可以借助靜态代理模式達到不更改原功能代碼但對原功能添加功能,例如上述我們添加日志功能,并且我們不借助靜态代理前我們通常都是通過server服務層來通路對應的實作,總歸來說執行流程取決于編輯好的程式,但我們使用靜态代理之後首先一方面,耦合性降低了,使用者可以自己來選擇要進行的功能

​ 劣勢:

  • 代碼量基本翻倍增長,每次實作一個功能還需要重複實作,維護成本大幅度提升

小結:正因為我們使用靜态代理劣勢太過明顯且繁瑣,是以我們才需要借助到:"動态代理"