定义:

为其他对象提供一种代理以控制对这个对象的访问;

角色:

1,抽象主题类,(接口或者抽象类),抽象真实主题和代理的共有方法(如下Subject类);

2,具体实现的主题类,继承或者实现抽象主题类的抽象方法(如下RealSubject类);

3,代理类,继承实现抽象主题类,并提供传递具体实现主题类,在实现方法里面调用具体实现的主题类(如下ProxySubject类);

Subject.java

/**
* Created by Administrator on 2016/8/31.
*/
public abstract class Subject {
public abstract void visit();
}

RealSubject.java

/**
* Created by Administrator on 2016/8/31.
*/
public class RealSubject extends Subject {
@Override
public void visit() {
System.out.print("RealSubject实现visit方法");
}
}

代理类ProxySubject.java :

/**
* Created by Administrator on 2016/8/31.
*/
public class ProxySubject extends Subject {
private RealSubject realSubject; public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
} @Override
public void visit() {
realSubject.visit();
}
}

测试类:

/**
* Created by Administrator on 2016/8/31.
*/
public class Test {
public static void main(String[] args) {
RealSubject RealSubject = new RealSubject();
ProxySubject ProxySubject = new ProxySubject(RealSubject);
ProxySubject.visit();
}
}

运行结果:

RealSubject实现visit方法

如上为静态代理,还有通过反射来实现的动态代理:

动态代理类:DynamicProxy.java (当出现主题是接口的时候比较适合)

public class DynamicProxy implements InvocationHandler {
private Object object; public DynamicProxy(Object object) {
this.object = object;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object, args);
return result;
}
}

定义抽象主题的接口:

/**
* Created by Administrator on 2016/8/31.
*/
public interface Subject {
public abstract void visit();
}
/**
* Created by Administrator on 2016/8/31.
*/
public class RealSubject implements Subject {
@Override
public void visit() {
System.out.println("RealSubject实现visit方法");
}
}
/**
* Created by Administrator on 2016/8/31.
*/
public class ProxySubject implements Subject {
private RealSubject realSubject; public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
} @Override
public void visit() {
realSubject.visit();
}
}

测试类:

import java.lang.reflect.Proxy;

/**
* Created by Administrator on 2016/8/31.
*/
public class Test {
public static void main(String[] args) {
System.out.println("----------------静态代理------------------");
RealSubject realSubject = new RealSubject();
ProxySubject ProxySubject = new ProxySubject(realSubject);
ProxySubject.visit();
System.out.println("----------------动态代理------------------");
DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
ClassLoader classLoader = realSubject.getClass().getClassLoader();
Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class
}, dynamicProxy);
subject.visit();

}
}

测试结果:

----------------静态代理------------------
RealSubject实现visit方法
----------------动态代理------------------
RealSubject实现visit方法

在android项目里面的使用:

比如针对不同sdk版本notifition的适配,就可以

  1. 首先定义notifition的公共抽象类或者接口
  2. 然后针对不同sdk版本实现这个notifition的实现类
  3. 然后代理类根据不同版本,调用不同的实现类去进行适配

在J2EE服务器项目中的使用:

Spring Aop面向切面编程,底层基于动态代理来实现向具体方法中插入功能。

设计模式 -- 代理模式 (Proxy Pattern)的更多相关文章

  1. 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释

    代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...

  2. 设计模式——代理模式(Proxy Pattern)

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...

  3. C#设计模式——代理模式(Proxy Pattern)

    一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系 ...

  4. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  5. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  6. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  7. 代理模式(Proxy pattern)

    代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...

  8. 13.代理模式(Proxy Pattern)

    using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...

  9. c#设计模式之代理模式(Proxy Pattern)

    引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...

随机推荐

  1. github 出现 Permission denied (publickey)的解决

    从github上clone的时候出现了以下错误 应该是ssh key过期了,试着重新创建ssh key,按以下步骤 1.  注意短横线前后都没有空格 接着一切都默认,它会在把ssh key 储存在 C ...

  2. 序列化和反序列化的几种方式(DataContractSerializer)

    序列化和反序列化的几种方式(DataContractSerializer) DataContractSerializer 类 使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档. 无法 ...

  3. 服务端套接字类CxServerSocket的使用

    服务端套接字类CxServerSocket的使用 这是一个精练的服务端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣能),个人习惯而已,如有雷同,纯属巧合. CxS ...

  4. Socket通信之Java学习(一)

    最近从一篇博客中看到了Socket的介绍,是阿蜜果姐姐的博文:http://www.blogjava.net/amigoxie/archive/2007/02/11/99331.html,学习了下. ...

  5. EF-Code First(5):二级缓存

    EF-Code First(5):二级缓存 〇.目录 一.前言 二.缓存设计 (一) 引用EFProviderWrappers (二) 缓存代码分析及整合 1. 关键代码简介 2. 应用缓存扩展 三. ...

  6. phpredis扩展

    <?php $redis = new Redis(); $redis->connect('127.0.0.1',6379); $redis->set('test','hello wo ...

  7. cooking eggs

    1: what is egg? what's the shape of it in details? 2: can egg run like this http://item.taobao.com/i ...

  8. set 类型

    set类型 map 容器是键-值对的集合,好比以人名为键的地址和电话号码. 相反地,set 容器只是单纯的键的集合.map 适用于字典.电话本.商品价目表等类似的模型.set 适用于黑名单.白名单等. ...

  9. Python之路 1Day

    1.python基础入门   作者:黄旭 提示: 语法基于python3.5版本(会提示2.7版本和3.5版本的区别) Python命令行将以>>>开始,比如 >>> ...

  10. [Android学习笔记4]四大应用组件之一:Service 上

    一.什么是Service 一个Service就是一个能够在后台执行长时操作的应用程序组件,并且不提供用户界面.一个应用程序组件能够启动一个Service,即使用户切换到另一个应用程序,这个Servic ...