定义:

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

角色:

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. Linux脚本学习随记

    把文件件的归属转移到其他用户上chown [-R] 账号名称:用户组名称 文件或目录 在进行hadoop分布式部署的时候,需要生成密钥对具体的操作如下先在master的hadoop目录下创建.sshm ...

  2. SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY

    SCOPE_IDENTITY.IDENT_CURRENT 和 @@IDENTITY SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY.IDENT_CUR ...

  3. 查看TOMCAT内存使用情况 以及修改方法

    查看TOMCAT内存使用情况 <% double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024); double m ...

  4. D3D游戏降帧的动态创建D3D设备以及ShellCode HOOK玩法

    欢迎转载,转载请注明出处:http://blog.csdn.net/gnorth/article/details/9327971 说白了,也就是HOOK掉Present,这种代码,其实百度上某些地方有 ...

  5. react+redux渲染性能优化原理

    大家都知道,react的一个痛点就是非父子关系的组件之间的通信,其官方文档对此也并不避讳: For communication between two components that don't ha ...

  6. maven pom.xml详细介绍,必须留一份

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  7. 使用HttpWebRequest模拟登陆阿里巴巴(alibaba、httpwebrequest、login)

    前言 其实老喜欢取经,偶尔也得分享下.关于阿里巴巴国际站的登陆,过程有点复杂但是算不上难.一不小心少个东西倒也挺麻烦的. 主要是看下请求类HttpClient基本请求封装使用,AliClient模拟浏 ...

  8. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  9. [oc] instancetype vs id for Objective-C 【转】

    原贴地址:http://blog.csdn.net/lyy_whg/article/details/12846055 http://www.iwangke.me/2013/01/06/instance ...

  10. Python_day1 基础语法

    1.基础语法变量: 在左侧自定义输入变量名,右侧可以输入任意类型赋值给左侧,如需制定类型,可以强转name = Jason, age = int(24) provience = ['beijing', ...