设计模式 -- 代理模式 (Proxy Pattern)
定义:
为其他对象提供一种代理以控制对这个对象的访问;
角色:
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的适配,就可以
- 首先定义notifition的公共抽象类或者接口
- 然后针对不同sdk版本实现这个notifition的实现类
- 然后代理类根据不同版本,调用不同的实现类去进行适配
在J2EE服务器项目中的使用:
Spring Aop面向切面编程,底层基于动态代理来实现向具体方法中插入功能。
设计模式 -- 代理模式 (Proxy Pattern)的更多相关文章
- 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释
代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...
- 设计模式——代理模式(Proxy Pattern)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
- C#设计模式——代理模式(Proxy Pattern)
一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系 ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
- 代理模式(Proxy pattern)
代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...
- 13.代理模式(Proxy Pattern)
using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...
- c#设计模式之代理模式(Proxy Pattern)
引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...
随机推荐
- Linux脚本学习随记
把文件件的归属转移到其他用户上chown [-R] 账号名称:用户组名称 文件或目录 在进行hadoop分布式部署的时候,需要生成密钥对具体的操作如下先在master的hadoop目录下创建.sshm ...
- SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY
SCOPE_IDENTITY.IDENT_CURRENT 和 @@IDENTITY SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY.IDENT_CUR ...
- 查看TOMCAT内存使用情况 以及修改方法
查看TOMCAT内存使用情况 <% double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024); double m ...
- D3D游戏降帧的动态创建D3D设备以及ShellCode HOOK玩法
欢迎转载,转载请注明出处:http://blog.csdn.net/gnorth/article/details/9327971 说白了,也就是HOOK掉Present,这种代码,其实百度上某些地方有 ...
- react+redux渲染性能优化原理
大家都知道,react的一个痛点就是非父子关系的组件之间的通信,其官方文档对此也并不避讳: For communication between two components that don't ha ...
- maven pom.xml详细介绍,必须留一份
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 使用HttpWebRequest模拟登陆阿里巴巴(alibaba、httpwebrequest、login)
前言 其实老喜欢取经,偶尔也得分享下.关于阿里巴巴国际站的登陆,过程有点复杂但是算不上难.一不小心少个东西倒也挺麻烦的. 主要是看下请求类HttpClient基本请求封装使用,AliClient模拟浏 ...
- django form表单验证
一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...
- [oc] instancetype vs id for Objective-C 【转】
原贴地址:http://blog.csdn.net/lyy_whg/article/details/12846055 http://www.iwangke.me/2013/01/06/instance ...
- Python_day1 基础语法
1.基础语法变量: 在左侧自定义输入变量名,右侧可以输入任意类型赋值给左侧,如需制定类型,可以强转name = Jason, age = int(24) provience = ['beijing', ...