代理模式也叫委托模式。

代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问。就是,代理类 代理 被代理类,来执行被代理类里的方法。

一般情况下,代理模式化有三个角色。

  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

23种设计模式----------代理模式(一)相关推荐

  1. 23种设计模式-代理模式《中介公司》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧 一个人避免不了与中介打交道,比如租房,你很少会遇上房东,而是所谓的二房东,等 ...

  2. 23种设计模式——代理模式

    学无止境 Java工程师的进阶之旅 目录 一.什么是代理 二.作用 三.静态代理 3.1.简介 3.2.实现步骤 3.3.缺点 四.动态代理 4.1.概念 4.2.分类 4.2.1.JDK动态代理 4 ...

  3. 23种设计模式——桥接模式

    文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...

  4. 23种设计模式-工厂模式

    23种设计模式-工厂模式 前言: [我们为什么需要使用工厂模式?] /*** 在使用工厂模式之前,我们要创建 实现了相同接口的对象 都需要直接new(),如下* */@Testpublic void ...

  5. 23种设计模式——工厂模式

    文章目录 23种设计模式--工厂模式 1.工厂模式概述 2.简单工厂模式 2.1.简单工厂模式的优缺点 2.2.简单工厂模式的结构 2.3.简单工厂模式的实现 3.工厂方法模式 3.1.工厂方法模式的 ...

  6. 23种设计模式常用模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...

  7. SSM源码分析之23种设计模式(策略模式和模板模式)

    23种设计模式之策略模式和模板模式 目录 策略模式使用场景 策略模式实现 模板模式 目录 策略模式使用场景 策略模式:根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法) ...

  8. 23种设计模式----模板方法模式----行为模式

    模板方法模式 1.模板方法模式是什么 2.模板方法的组成 3.模板方法中不同的类的行为 4.例子 4.1 例子的背景 4.2模板类--父亲寻找继承人的方式 4.3实现类----孩子类 4.4测试类-- ...

  9. 23种设计模式----原型模式----创建型模式

    原型模式 1.1什么是原型模式 1.2为什么要使用原型模式 2.原型模式的解释 3.例子 3.1例子将要实现的目标 3.2例子设计 3.3原型类 3.4具体实现的3个原型实例类 3.5管理类 3.6工 ...

最新文章

  1. DotText源码学习——ASP.NET的工作机制
  2. linux系统怎么关闭usb端口,linux系统挂载以及卸载USB接口的设备的解决办法
  3. 重磅!2021年考研国家线正式公布,部分学科分数线比去年更低!
  4. linux导出文件夹到u盘,Linux系统放到U盘上直接在U盘上运行Linux
  5. jack对海量数据库的一些总结
  6. 大学使用python 编辑器_[雪峰磁针石博客]2018 最佳python编辑器和IDE
  7. Python 连接MongoDB并比较两个字符串相似度的简单示例
  8. django 用户认证
  9. web客户端安全之跨站点请求伪造攻击
  10. atomikos 异常报错(java.lang.NoSuchMethodException)
  11. 子在川上曰,逝者如斯夫
  12. python根据手表货号从腕表之家网站爬取相应信息
  13. magisk安装失败_俄罗斯官改MIUI MiRoom安装刷入教程
  14. 基于STM32F4的智能门锁系统
  15. 抖音短连接v.douyin.com/xxx 如何生成?
  16. linux查看指定目录下各个文件大小以及总体大小
  17. LeetCode:322. 零钱兑换(python)
  18. 用 Python 给女友做了个可能会被打死的七夕礼物
  19. Understanding the Bias-Variance Tradeoff(深入理解偏差和方差)
  20. iOS加载字体包(此处已思源宋体为例)

热门文章

  1. 8idmp导入oracle 11g,11g导入8i的dmp文件问题
  2. pywin32官方说明文档_GEE学习笔记 六十五:GEE的Python版API说明文档(英文版)
  3. python2异步编程_python异步编程入门
  4. C语言入门经典题目及其答案
  5. 图论--差分约束系统
  6. Java字符串编码和转换操作
  7. 芝麻信用分750以上有什么特殊作用?
  8. 中国房地产市值已经超过450万亿,为何还不见房价下跌?
  9. 意大利终于付出了代价
  10. Ubuntu中配置FTP服务