设计模式 -- 代理模式 (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)
引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...
随机推荐
- Dynamics CRM不发布JS调试
本博客已迁移至 http://www.krely.cn/ 上个项目做了一年多,大多是在做JS的开发,由于开发人数比较多,着实被坑的不轻.因为JS修改完成之后必须要发布,对于我们动辄几千行的JS的调 ...
- Unknown
鉴于自己的直觉总是很准,所以这次再相信一次好了 T1:我觉得极有可能考到的是 1.对于栈,队列的模拟: 2.数论(不是像gcd那样的题目,而是加法原理乘法原理斥容,或是极具数学推导的东西,当然有可能用 ...
- Day3:T1数论+高精 T2搜索
T1:数论+高精(水~) 根据题意可知,从除的数越大越好(在0~9中) 所以我们只要用到高精除然后再模拟一下就可以了 //MARK:但是要注意0-9这个特殊值需要特判,因为题目要求输出的数至少是两位数 ...
- c# 发送Email的2中方式
先来第一种 // 版权所有 ZhuoYue Co.,Ltd 卓越一通秘密信息 // 文件名称:MyEmailByCDO.cs // 作 者:huangzh // 创建日期:2015-08-20 16: ...
- JavaScript插件——按钮
Bootstrap3.0学习第二十四轮(JavaScript插件——按钮) 前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/ ...
- python线程Example
# -*- coding:utf-8 -*- import time import pymongo from threading import Thread from Queue import Que ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 二
本次改动的主要内容是实现MongoDB.Repository对MongoDBRef的支持. MongoDB对一对一,一对多,多对多关系的维护,官方推荐文档嵌入方式,反映到模型的设计如下: public ...
- SQL Server的数据加密简介
防止开发人员获取到敏感数据(SQL Server的数据加密简介) 背景 有时候,我们还真的会碰到这样的需求:防止开发人员获取到敏感数据.也许你觉得很简单,把开发和运营分开不就可以了吗?是的,如果公司有 ...
- 基于Hadoop开发网络云盘系统架构设计方案
基于Hadoop开发网络云盘系统架构设计方案第一稿 引言 云计算技术的发展,各种网络云盘技术如雨后春笋,层出不穷,百度.新浪.网易都推出了自己的云盘系统,本文基于开源框架Hadoop设计实现了一套自己 ...
- Myeclipse新建 配置Hibernate
一.新建一个JAVA项目 二.选中新建的项目单击右键[Add Hibernate Capab-] 三.添加MyEclipse Hiberate Libaries(Hibernate 3.2) 单击[B ...