首先来看一下代理模式的定义:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与委托类有同样的接口。代理模式是常用的java设计模式。

代理模式能够在不修改源码的情况下增强方法,在方法前后增加日志记录,权限管理等功能。

表现形式如下图:

在java中,代理模式分成2种:静态代理模式和动态代理模式;今天我们主要讨论的是静态代理。

1 静态代理
静态代理模式满足如下的几个条件:
a.代理对象的类是真实存在的,并非动态生成的。
b.代理对象持有被代理对象的引用
c.代理对象中的方法通过被代理对象的引用调用被代理对象的方法,同时执行代理逻辑。

下面是一个简单的代理模式,相关代码说明已经在注释中给出,不再另外说明

接口类:

/*
+V.X java8733 获取更多资源 * 接口
* 代理类和委托类都必须实现该类
*/
public interface ISubject { //处理任务的抽象方法
public void dealTask(String task);
}

  

委托类:

/*
+V.X java8733 获取更多资源 * 真实角色(被代理类,委托类)
* 实现接口Isubject
*/
public class RealSubject implements ISubject { @Override
public void dealTask(String task) {
//真实角色处理任务
System.out.println("正在"+task);
} }

  

代理类:

/*
+V.X java8733 获取更多资源 * 代理类
* 实现ISubject接口
* 持有被代理类的引用
*/
public class Proxy implements ISubject { //持有被代理类的引用
private RealSubject realSubject; //在构造方法中初始化被代理类
public Proxy(RealSubject r) {
this.realSubject=r;
} @Override
//在该方法中加入代理逻辑
public void dealTask(String task) {
System.out.println("开始帮忙....");
//加入线程睡眠模拟帮忙的行为
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//真正执行动作的仍然是真实角色
realSubject.dealTask(task);
} }

  

静态工厂类:

/*
+V.X java8733 获取更多资源 * 静态工厂类
* 对于客户端来说 并不关心执行动作的是代理对象还是真实角色
* 所以我们创建一个静态方法直接返回对象
*/
public class StaticFactory { //调用此方法获得实例
public static ISubject getInstance(){
return new Proxy(new RealSubject());
}
}

  

测试类:

/*
* 测试类(客户类)
+V.X java8733 获取更多资源
*/
public class Test { public static void main(String[] args) {
//创建代理对象时需要一个真实对象的实例
ISubject instance = StaticFactory.getInstance();
//使用代理类的方法
instance.dealTask("敲代码");
}
}

  

就是这样,真正的业务功能还是有委托类来实现,但是在实现业务类之前的一些公共服务。例如在项目开发中我们没有加入缓冲,日志这些功能,后期想加入,我们就可以使用代理来实现,而没有必要打开已经封装好的委托类。

推荐阅读上海尚学堂java相关技术文章,欢迎评论建议,转载请注明出处!

谈谈Java中的代理模式的更多相关文章

  1. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  2. 说说Java中的代理模式

    今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...

  3. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

  4. 深入理解JAVA中的代理模式

    前言 代理是什么 事故现场:我家的宠物今天生病了,而我又没有相关的医学知识,所以我只让我的宠物多喝热水吗? 结果显然是不行的,所以我需要去找宠物医生这些更专业的人来帮我的宠物治病. 这个时候,代理就出 ...

  5. Java中的代理模式--静态代理和动态代理本质理解

    代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...

  6. 实例_ Java中的代理模式

    静态代理 我们定义一个接口,并且使用代理模式,想要做到的就是在调用这个接口的实现类时在此方法上添加功能. public interface HelloInterface { void sayHello ...

  7. Java 中的代理模式及动态代理

    原文:https://blog.csdn.net/briblue/article/details/73928350

  8. Objective-C中的委托(代理)模式

    我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...

  9. Java设计模式:代理模式(转)

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一 ...

随机推荐

  1. 关于vue中tamplate和DOM节点浅谈

    前言:在开发前段页面使用vue时,我们能经常看到template标签.这里粗略讲下自己对vue中template理解和使用. 1. 先了解vue vue.js是一个轻巧.高性能.壳组件画的MVVM库. ...

  2. docker mysql 主主同步

    转发自:https://blog.csdn.net/money9sun/article/details/85099134 第一步:安装docker   https://www.cnblogs.com/ ...

  3. VS2008打上SP1的补丁后安装了silverlight后出现未将对象引用设置到对象实例的解决办法

    新建silverlight项目失败,提示 未将对象设置到实例 的解决办法: 1.打开 visual studio 命令提示 输入一下命令:2.devenv /resetskippkgs ,这条命令会启 ...

  4. Go的并发调度原理

    Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言:也正是Go语言的并发特性,吸引了全球无数的开发者.   并发(concurrency)和并行(parallellism) 并发 ...

  5. yarn 常用命令

    1.安装 yarn npm install yarn -g 2.卸载yarn npm uninstall yarn -g

  6. target = e.target || e.srcElement(转载)

    //鼠标点击出现下拉菜单,点其他地方,缩回去. document.addEventListener("mousedown", function(e) { var target = ...

  7. Redis学习笔记:与SpringBoot结合使用

    首先需要在pom文件中导入相应的Redis依赖(版本可以会变化,下面坐标也可能会变化) <dependency> <groupId>org.springframework.bo ...

  8. ios 对于AFNetworking3.0的基本使用

    AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持.AFHTTPRequestOperationManager已经抛弃,所以需要对数据请求进行改动. G ...

  9. 创建和管理SQL Server数据库

    1.创建数据库 右击“数据库”,在弹出的快捷菜单中选择“新建数据库”选项 2.分离和附加数据库 分离:右击数据库"MySchool",在弹出的快捷菜单中选择“任务”—“分离”选项 ...

  10. Desktop Central 的移动设备管理功能

    Desktop Central 的移动设备管理功能1.移动应用程序管理设备管理不会仅仅只是配置策略.检索资产信息和保护设备.应用程序管理与设置员工的移动设备一样重要.使用 Desktop Centre ...