package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author jiq
* 类型:Structural
* 定义: 代理模式为另一个对象提供一个占位符(替身)以控制这个对象的访问。
* 话句话说,使用代理对象,可以让代理对象控制对某个对象的访问,被代理
* 的对象可以是远程对象,创建开销大的对象,或需要安全控制的对象。
*
* 为什么要控制访问:代理模式之所以要控制访问,是因为我们的客户不知道如何同
* 远程对象(被代理的对象)沟通。 比如远程代理访问,其帮助我们处理一些网络
* 上的细节。
*
* 区别: 装饰器模式包装一个对象,并提供额外的行为。
* 适配器模式包装一个对象,并转换成不同的接口(接口改变)。
* 外观模式包装许多对象,以简化他们的接口(接口改变)。
* 代理模式包装一个对象,并控制它的访问(不改变被代理对象的接口)。
* 其实虽然从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,
* 而Decorator是增加职责。
*
* 应用: Spring AOP的核心设计思想。 Java RMI(远程方法调用)
*
* 代码说明:由于一些特殊原因,客户端无法直接访问真正的主题(比如网络问题,并发换环境等)。
* 这个时候我们通过一个代理来控制对真正主题的访问,比如远程代理会帮忙处理一些网络上
* 的细节,多线程环境下的代理会帮忙解决一些同步问题等。 然后客户端通过代理来访问对象。
*/
interface Subject{
public void request();
}
/**
* 真正的角色,实现了request方法
* */
class RealSubject implements Subject{
public void request(){
System.out.print("real request handling\n");
}
}
/************************************************
* 静态代理,封装(控制)request方法的访问
************************************************/
class StaticProxySubject implements Subject{
private RealSubject realSubject; //组合被代理的对象
public void request(){
//do some thing else...
if(realSubject == null){
realSubject = new RealSubject();
}
realSubject.request(); //真正的request调用
//do some thing else...
}
}
/***********************************************************
* 动态代理. java.lang.reflect包中有自己的代理支持,利用这个包
* 你可以在运行时动态创建一个代理类,实现一个或者多个接口,并将
* 方法的调用转发到你所指定的类。
* 因为实际的代理类是在运行时创建的,所以我们称这个技术为动态代理。
* ***********************************************************/
class DynamicProxySubject implements InvocationHandler{
private Object realSubject; //组合被代理的对象
public DynamicProxySubject(Object realSubject){
this.realSubject = realSubject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//do some thing else...
return method.invoke(realSubject, args);
//do some thing else...
}
}
/**************************************************
* 客户端,代理ProxySubject控制其对RealSubject的访问
* ************************************************/
public class ProxyTest {
public static void main(String[] args) {
//通过静态代理来访问对象
Subject proxy = new StaticProxySubject();
proxy.request();
//通过动态代理来访问对象
RealSubject real = new RealSubject();
Subject subject = (Subject) Proxy.newProxyInstance(
real.getClass().getClassLoader(), //定义代理类的类加载器
real.getClass().getInterfaces(), //代理类要实现的接口列表
new DynamicProxySubject(real)); //指派方法调用的调用处理程序
subject.request();
}
}
分享到:
相关推荐
JAVA-设计模式-结构型模式-代理模式
代理模式是一种在面向对象设计中广泛应用的结构型设计模式,它提供了一种对目标对象进行间接访问的方式,使得客户端可以通过代理对象与真实对象进行交互,而无需直接接触真实对象。这样做的好处包括增加灵活性、控制...
代理模式的基本结构包括三个主要角色:真实主题(RealSubject)、代理(Proxy)和客户端(Client)。真实主题是代理所代表的对象,它实现了与客户端交互所需的接口。代理类则实现了相同的接口,但其内部包含了一个...
结构型模式如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)和桥接(Bridge)等,关注如何组合和组装对象,使不同组件之间可以协同工作,增强系统的结构。 行为型模式如观察者(Observer)、策略...
本实验报告主要探讨了五个关键的设计模式:组合模式、外观模式、代理模式、观察者模式以及策略模式,这些都是软件体系结构中的重要组成部分,对于理解和优化代码结构具有深远影响。 1. **组合模式**: 组合模式是一...
代理模式是一种设计模式,属于结构型模式之一,其主要目的是为其他对象提供一个代理,以控制对该对象的访问。在实际应用中,代理模式能够帮助我们实现如下的功能: 1. 远程代理:代理对象可以代表一个位于远程系统...
设计模式_结构型_代理模式
在本文中,我们将探讨几种结构型设计模式,包括适配器模式、桥接模式、外观模式、享元模式、代理模式和装饰器模式。 1. **适配器模式**: - 适配器模式用于连接两个不兼容的接口,使得原本不能一起工作的类可以...
#### 二、代理模式的基本结构与原理 代理模式通常涉及以下三种角色: 1. **Subject(主题接口)**:定义了RealSubject和Proxy共同的接口,使得Proxy可以作为RealSubject的替代品。 2. **RealSubject(真实主题)**:...
代理模式-概念图.pdf和代理模式-类图.pdf文件很可能是用来进一步阐述代理模式的概念和类之间的关系。概念图可能通过图形化的方式展示了代理模式的基本结构和工作流程,而类图则使用UML(统一建模语言)展示了代理类...
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 -享元模式:使用共享对象可以有效地支持大量细粒度的对象。 3. 行为型设计模式: - 责任链模式:避免对象之间耦合度过高,通过将请求沿着处理者链...
本文将深入探讨其中的两种结构型模式:适配器模式和代理模式。 1. 适配器模式 适配器模式是一种将两个不兼容的接口进行转换的模式,使得原本无法协同工作的类能够一起工作。它主要分为类适配器模式和对象适配器...
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 - 组合模式:将对象组织成树形结构,可以同等地对待单个对象和对象集合。 - 装饰模式:动态地给一个对象添加一些额外的职责。 - 复用模式(享元...
静态代理模式是设计模式中的一种,属于结构型模式,主要用在我们想要在不修改原有对象的基础上,为对象添加额外功能或者控制对象的行为时。在这个例子中,"优秀的设计模式示例-静态代理模式"提供了实际项目中的代码...
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型设计模式**: - 责任链模式:将请求沿着处理者链进行传递,直到某个处理者处理请求。 - 命令模式:将命令封装为对象,以便使用不同的...
设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...
代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于保护、延迟加载、记录请求等场景,可以在不改变原有对象的情况下为其增加新的功能。 代理...
1. **代理模式**:在对象访问控制方面,通过代理对象来控制对原对象的访问。 2. **装饰器模式**:动态地给对象添加新的职责,比继承更灵活,不会破坏类的封装性。 3. **适配器模式**:将不同接口的对象互相协作,...