手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

认识Java中的代理模式

[日期:2018-01-25] 来源:Linux社区  作者:Linux [字体: ]

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

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

表现形式如下图:

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

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

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

接口类:

/*
更多资源 www.linuxidc.com
 * 接口
 * 代理类和委托类都必须实现该类
 */
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);
}
 
}

代理类:

/*
更多资源 www.linuxidc.com
 
 * 代理类
 * 实现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);
}
 
}

静态工厂类: 

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

测试类:

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

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

本文永久更新链接地址http://www.linuxidc.com/Linux/2018-01/150561.htm

linux
相关资讯       Java代理模式 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款