23種設計模式----------代理模式(一)

代理模式也叫委托模式。

代理模式定義:對其他對象提供一種代理從而控制對這個對象的訪問。就是,代理類 代理 被代理類,來執行被代理類里的方法。

一般情況下,代理模式化有三個角色。

  1,抽象的主題類(或者接口) IGamePlayer
  2,代理類。
  3,被代理類。

下面以游戲玩家代理為例。

一,先來看下最基本的代理模式。

代碼如下:

主題接口:
 1 package com.yemaozi.proxy.base;
 2 
 3 //游戲玩家主題接口
 4 public interface IGamePlayer {
 5     //登錄游戲
 6     public void login(String username, String password);
 7     
 8     //擊殺Boss
 9     public void killBoss();
10     
11     //升級
12     public void upGrade();
13 }

被代理類:

 1 package com.yemaozi.proxy.base;
 2 
 3 //需要代理的主題類。
 4 public class GamePlayer implements IGamePlayer{
 5     
 6     private String name = "";
 7     
 8     public GamePlayer(String name){
 9         this.name = name;
10     }
11     
12     public void login(String username, String password) {
13         System.out.println("登錄名為 "+username+" 進入游戲," + name + " 登錄成功!");
14     }
15         
16     public void killBoss() {
17         System.out.println(this.name + " 擊殺了Boss!");
18     }
19 
20     public void upGrade() {
21         System.out.println(this.name + "升級了!");
22     }
23 
24 }

代理類:

 1 package com.yemaozi.proxy.base;
 2 
 3 //代理類
 4 //代理也是個游戲玩家,所以也要實現IGamePlayer
 5 public class ProxyGamePlayer implements IGamePlayer{
 6 
 7     private IGamePlayer proxyGp = null;
 8     
 9     //代理需要獲取被代理的信息,就是執行被代理所要執行的方法,
10     //所以要獲取被代理的對象。這里通過構造方法獲取。
11     public ProxyGamePlayer(GamePlayer gp){
12         this.proxyGp = gp;
13     }
14     
15     public void login(String username, String password) {
16         System.out.println("代理登錄的游戲!");
17         proxyGp.login(username, password);
18     }
19 
20     public void killBoss() {
21         proxyGp.killBoss();
22     }
23 
24     public void upGrade() {
25         proxyGp.upGrade();
26     }
27 }

先來看下不用代理類的場景類:

 1 package com.yemaozi.proxy.base;
 2 
 3 //這是正常的,用非代理的情況下。
 4 public class Client {
 5     public static void main(String [] args){
 6         IGamePlayer gp = new GamePlayer("張三");
 7         //開始執行主題接口中的方法。
 8         //登錄游戲
 9         gp.login("zhangsan", "123456");
10         //殺怪
11         gp.killBoss();
12         //升級
13         gp.upGrade();
14     }
15 }
16 
17 執行結果:
18 登錄名為 zhangsan 進入游戲,張三 登錄成功!
19 張三 擊殺了Boss!
20 張三升級了!

游戲也有玩累,玩乏的時候,所以找個代練來升級。下面就是代理類的場景類。

 1 package com.yemaozi.proxy.base;
 2 
 3 //代理客戶端
 4 public class BasePoxyClient {
 5     public static void main(String[] args){
 6         IGamePlayer proxyGp = new ProxyGamePlayer(new GamePlayer("張三"));
 7         proxyGp.login("zhangsan", "123456");
 8         proxyGp.killBoss();
 9         proxyGp.upGrade();
10     }
11 }
12 
13 執行結果為:
14 代理登錄的游戲!
15 登錄名為 zhangsan 進入游戲,張三 登錄成功!
16 張三 擊殺了Boss!
17 張三升級了!

執行還是這樣,但是可以看出,確實是代理類來執行的。這就是最簡單的代理模式了。

代理模式還是有很多種的,比如,普通代理模式,強制代理模式,虛擬代理模式,動態代理模式.....

接下來我們一一來看。

二,普通代理模式:

其實普通代理模式和上面的差不多。

普通代理模式,它不用知道代理的真實角色是誰,屏蔽了真實角色的更變對高層模塊的影響。
(本例中,就是,不用知道為誰代練游戲,只需要知道代練游戲的用戶名,密碼即可。)

代碼如下:

抽象主題類或者接口:

 1 package com.yemaozi.proxy.common;
 2 
 3 /**
 4  * 普通代理模式:就是我們要知道代理的存在,然后才能訪問(或者使用代理)。
 5  * 對于基本的代理改動較小。只改變實現類中
 6  * @author yemaozi
 7  */
 8 public interface IGamePlayer {
 9     //登錄游戲
10     public void login(String username, String password);
11     
12     //擊殺Boss
13     public void killBoss();
14     
15     //升級
16     public void upGrade();
17 }

需要被代理類:

 1 package com.yemaozi.proxy.common;
 2 
 3 public class GamePlayer implements IGamePlayer{
 4 
 5     private String name = "";
 6     
 7     //通過構造方法,將代理傳遞進來。
 8     public GamePlayer(IGamePlayer proxyGp, String name){
 9         if(proxyGp == null){
10             //處理非正常情況。
11         }else{
12             this.name = name;
13         }
14     }
15     //登錄游戲
16     public void login(String username, String password) {
17         System.out.println("登錄名為 "+username+" 進入游戲," + name + " 登錄成功!");
18     }
19     //殺Boss
20     public void killBoss() {
21         System.out.println(this.name + " 擊殺了Boss!");
22     }
23 
24     //升級
25     public void upGrade() {
26         System.out.println(this.name + "升級了!");
27     }
28 
29 }

代理類:

 1 package com.yemaozi.proxy.common;
 2 
 3 public class ProxyGamePlayer implements IGamePlayer{
 4 
 5     private IGamePlayer proxyGp = null;
 6     
 7     public ProxyGamePlayer(String name){
 8         
 9         try {
10             //通過構造方法創建GamePlayer,同時將自己傳遞進去。用于在GamePlayer判斷業務邏輯
11             proxyGp = new GamePlayer(this, name);
12         } catch (Exception e) {
13             e.printStackTrace();
14         }
15     }
16     
17     public void login(String username, String password) {
18         System.out.println("代理登錄的游戲!");
19         proxyGp.login(username, password);
20     }
21 
22     public void killBoss() {
23         proxyGp.killBoss();
24     }
25 
26     public void upGrade() {
27         proxyGp.upGrade();
28     }
29 
30 }

看下場景類:

 1 package com.yemaozi.proxy.common;
 2 
 3 /**
 4  * 普通代理模式,它不用知道代理的真實角色是誰,屏蔽了真實角色的更變對高層模塊的影響。
 5  * (本例中,就是,不用知道為誰代練游戲,只需要知道代練游戲的用戶名,密碼即可。)
 6  * @author yemaozi
 7  *
 8  */
 9 public class Client {
10     public static void main(String[] args){
11         IGamePlayer proxyGp = new ProxyGamePlayer("張三");
12         proxyGp.login("zhangsan", "123456");
13         proxyGp.killBoss();
14         proxyGp.upGrade();
15     }
16 }
17 
18 執行結果:
19 代理登錄的游戲!
20 登錄名為 zhangsan 進入游戲,張三 登錄成功!
21 張三 擊殺了Boss!
22 張三升級了!

在場景類中,我們發現,我們并不需要知道具體為誰代理,把被代理類進行了隱藏。所以,被代理若是有所修改,只要實現了對應接口中的方法,則不會影響代理的執行。

?

(下一篇)23種設計模式----------代理模式(二)

?

轉載于:https://www.cnblogs.com/yemaozistar/p/4161960.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257897.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(轉) Quartz學習——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成詳解(四)

http://blog.csdn.net/u010648555/article/details/60767633 當任何時候覺你得難受了,其實你的大腦是在進化,當任何時候你覺得輕松,其實都在使用以前的壞習慣。 通過前面的學習,你可能大致了解了Quartz,本篇博文為你打…

被流氓360設置瀏覽器主頁的解決辦法(如果你也遇到了跟我一樣的問題,不妨看一下是不是這個原因)...

最近電腦罷工,重裝了系統;很多常用軟件都不得不重新安裝,其實這都不是事兒,現在基本上都是百兆光纖了,下載安裝都很順溜。 瀏覽器也在安裝之列,因為搞開發所以谷歌火狐瀏覽器都是必裝的;平時基本…

BZOJ1834 [ZJOI2010]network 網絡擴容

網絡流訓練好題。。。但是要給差評!蒟蒻表示這就是板子題,然后做了半個小時T T 先跑一邊最大流,得到第一問答案ans。 第二問:原先的邊不動,費用為0。 然后對每條邊在上面再加一條邊,流量為inf,費…

android 更新平臺,Android更新平臺架構方案

這篇文章是去年寫的,我們的兩款app一直這使用umeng的更新服務,但是16年umeng開始放棄更新服務,考慮到切換到其他更新平臺也會面臨這樣的問題,我開始著手自己搭建一個更新平臺。整體方案包含前后端,客戶端代碼封裝成jar…

setSignVisible的修改

store傳入accountReducer 1.從cookie中獲取id,avatar,nickname.2.createStore(reducer, initState)傳入reducer,可以在頁面中state.accountReducer.current_account獲取 const middleware routerMiddleware(browserHistory); let initState {};if(Cookie.hasItem("id&qu…

DGbroker故障切換示例

1.主庫故障 SQL> startup ORACLE instance started.Total System Global Area 1068937216 bytes Fixed Size 2260088 bytes Variable Size 910164872 bytes Database Buffers 150994944 bytes Redo Buffers 5517312 bytes ORA-00205: e…

html 自動觸發 事件,js自動觸發事件自定義事件

在有些情況下,我們需要程序邏輯自動觸發元素的事件,例如js提供了click(), form提供了reset(),submit()等方法!在jquery中提供了trigger()方法幫助我們自動觸發事件,原理是什么呢?接下來讓我們一探究竟&…

Storm編程入門API系列之Storm的可靠性的ACK消息確認機制

概念,見博客 Storm概念學習系列之storm的可靠性 什么業務場景需要storm可靠性的ACK確認機制? 答:想要保住數據不丟,或者保住數據總是被處理。即若沒被處理的,得讓我們知道。 public void nextTuple() {num;System.out.…

關于 php mysql pdo cannot find driver 解決方案

1、下載 文件 或者 進入 在PHP源碼包中進入ext/pdo_mysql http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz 2、解壓文件tar zxvf PDO_MYSQL-1.0.2.tgz 3、配置和編譯文件cd PDO_MYSQL-1.0.2/usr/local/php/bin/phpize./configure –with-php-config/usr/local/php/bin/php-config…

iOS網絡編程開發-數據加密

iOS網絡編程開發-數據加密 一、簡單說明 1.說明 在開發應用的時候,數據的安全性至關重要,而僅僅用POST請求提交用戶的隱私數據,還是不能完全解決安全問題。 如:可以利用軟件(比如Charles)設置代理服務器&am…

Codeforces 821C - Okabe and Boxes

821C - Okabe and Boxes 思路&#xff1a;模擬。因為只需要比較棧頂和當前要刪除的值就可以了&#xff0c;所以如果棧頂和當前要刪除的值不同時&#xff0c;棧就可以清空了(因為下一次的棧頂不可能出現在前面那些值中)。 代碼&#xff1a; #include<bits/stdc.h> using n…

Java中forEach, 用來遍歷數組

這里的for是Java中forEach, 用來遍歷數組的。for(int i : d) 就是遍歷int型數組d的 每一次訪問數組d的時候讀取的數據放入int型的i中。和for(int i0;i<d.length();i)是一樣的&#xff0c;但是forEach的可用場合較多。public class e1 {public static void main(String[] …

HDU -2546飯卡(01背包+貪心)

這道題有個小小的坎&#xff0c;就是低于5塊不能選&#xff0c;大于5塊&#xff0c;可以任意選&#xff0c;所以就在初始條件判斷一下剩余錢數&#xff0c;然后如果大于5的話&#xff0c;這時候就要用到貪心的思想&#xff0c;只要大于等于5&#xff0c;先找最大的那個&#xf…

圖片向上滾動字幕代碼html,如何通過制作滾動字幕的軟件實現這種片尾的向上滾動字幕效果...

如何制作滾動字幕 特殊滾動類字幕制作 向上向下向左向右滾動字幕制作效果 含拖動和消失全程 真是酷B了爽呆了&#xff0c;趕快學習吧&#xff01;電影、連續劇等影視作品片尾&#xff0c;都會在播放片尾曲時&#xff0c;出現向上滾動的字幕&#xff0c;顯示演員表、導演、編劇等…

【圖片服務器】搭建Nginx圖片服務器

一、安裝Nginx 二、安裝vsftpd 三、開始搭建Nginx圖片服務器 1、效果 例如&#xff1a;圖片通過ftp服務上傳到/home/ftpuser/www/images目錄下&#xff0c;我想通過訪問Nginx服務器來訪問ftp目錄下的圖片文件&#xff0c;該url為http://192.168.128.128/images/xxx.jpg。即使用…

JavaScript數組去重

1、數組去重&#xff1b; Array類型并沒有提供去重復的方法&#xff0c;如果要把數組的重復元素干掉&#xff0c;那得自己想辦法&#xff1a; 方法一&#xff1a;利用indexOf方法&#xff1b; var aa[1,3,5,4,3,3,1,4] function arr(arr) {var result[]for(var i0; i<arr.le…

html怎么讓方塊自動旋轉,如何使用純CSS實現一個圓環旋轉錯覺的動畫效果(附源碼)...

本篇文章給大家帶來的內容是關于如何使用純CSS實現一個圓環旋轉錯覺的動畫效果&#xff0c;有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對你有所幫助。效果預覽源代碼下載https://github.com/comehope/front-end-daily-challenges代碼解讀定義 dom&…

同志亦凡人第五季/全集BQueer As Folk 5迅雷下載

同志亦凡人 第五季 Queer as Folk Season 5 (2005) 本季看點&#xff1a;這是一群生活在匹茲堡男人和男人&#xff0c;女人和女人的故事。在他們的王國里有各色人物。王國的國王Brian&#xff08;葛爾?哈羅德 Gale Harold 飾&#xff09;&#xff0c;只追求性不問愛&#xff1…

2016,請不要在公司混日子!

1、無論為誰打工&#xff0c;要為自己學東西&#xff0c;客觀上為公司創造價值。 我自己當年&#xff0c;無論我在方正給國內企業工作&#xff0c;還是我在雅虎給外國人工作&#xff0c;我都跟別人最大的不一樣&#xff0c;我從來不覺得我在給他們打工&#xff0c;我真的可能是…

數據庫作業[定時執行任務]的創建

--每月執行的作業 exec p_createjob jobnamemm,sqlselect * from syscolumns,freqtypemonth --每周執行的作業 exec p_createjob jobnameww,sqlselect * from syscolumns,freqtypeweek --每日執行的作業 exec p_createjob jobnamea,sqlselect * from syscolumns --每日執行的作…