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.mzph.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 --每日执行的作…