代理模式定义
定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
-
Subject:抽象角色,提取的公共方法,可以是一个接口或者抽象类
-
RealSubject:真实角色,实现具体的业务逻辑
-
Proxy:代理角色,对真实角色的逻辑处理,实现抽象角色的方法,并可以加上自己的操作逻辑。
实例说明
代理也就是委托,我首先想到的就是游戏代练。这个大家熟悉吧,下面就拿游戏代练来说明一下代理模式:
1.抽象角色:也就是公共方法-玩游戏刷级
public interface AbstractPlayer {
//玩游戏-刷级
public void playGame();
}
2.真实角色:这里指的是玩游戏的人
public class GamePlayer implements AbstractPlayer {
private String name="";
public GamePlayer(String name){
this.name=name;
}
@Override
public void playGame() {
Log.e("qzs","玩游戏-刷级");
}
}
3.代理,这里找个游戏代练来帮他刷级
public class Proxy implements AbstractPlayer {
private GamePlayer gamePlayer=null;
public Proxy(GamePlayer gamePlayer){
this.gamePlayer=gamePlayer;
}
@Override
public void playGame() {
this.gamePlayer.playGame();
}
}
4.调用:
//新建一个游戏者
GamePlayer gamePlayer=new GamePlayer("秦子帅");
//定义一个代练者
Proxy proxy=new Proxy(gamePlayer);
//玩游戏刷级
proxy.playGame();
模式结构
代理模式分为静态代理、动态代理。
静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
静态代理最基本的就是上面的实例了,下面主要讲解一下动态代理,这很重要。
动态代理
动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
首先先了解一下动态代理类
1.Interface InvocationHandler:
该接口中仅定义了一个方法Object:invoke(Object obj,Method method,Object[] args)。这个抽象方法在代理类中动态实现。
我们来看一下invoke中的三个参数:
-
obj一般是指代理类
-
method是被代理的方法
-
args为该方法的参数数组。
2.Proxy:
动态代理类,提供了getProxyClass (ClassLoader loader,Class[] interfaces)和newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)两种静态方法。
我们来看一下newProxyInstance中的三个参数:
-
CLassLoader loader:类的加载器
-
Class<?> interfaces:指定动态代理类需要实现的所有接口
-
InvocationHandler h:得到InvocationHandler接口的子类的实例
还拿上面的实例说:
1.建立动态代理类:
public class DynamicProxy implements InvocationHandler {
//对真实对象的引用-被代理的实例对象
private Object obj;
public DynamicProxy(Object obj){
this.obj=obj;
}
@Override
public Object invoke(Object o, Method method, Object[] args) throws Throwable {
Object result;
//可以加上调用方法之前的操作
result= method.invoke(this.obj,args);
//可以加上调用方法之后的操作
return result;
}
}
2.调用:
//新建一个游戏者
AbstractPlayer abstractPlayer=new GamePlayer("秦子帅");
InvocationHandler invocationHandler=new DynamicProxy(abstractPlayer);
//类加载器
ClassLoader classLoader=abstractPlayer.getClass().getClassLoader();
//动态产生一个代理者
AbstractPlayer proxy= (AbstractPlayer) Proxy.newProxyInstance(classLoader,new Class[]{AbstractPlayer.class},invocationHandler);
proxy.playGame();
注意:实现动态代理的首要条件:被代理类必须实现接口。
还有一些没有提出来,比如强制代理等等,这些大家可以自己去写一写...
文章学习参考了《设计模式之禅》与网上博文
另外可以加入我的Android技术交流群:458739310
大家可以关注我的微信公众号:「安卓干货铺」一个有质量、有态度的公众号!
相关推荐
本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...
### 23种设计模式(通俗易懂篇) #### 创建型模式 1. **Factory(工厂模式)** - **应用场景**:当你需要为用户提供多种选择时,例如选择不同的餐厅来满足不同用户对食物的偏好。 - **原理**:在工厂模式中,...
### 设计模式详解 设计模式是在软件开发过程中针对常见的问题所总结出来的最佳实践,它能够帮助开发者更加高效地解决问题,并提高代码的复用性、扩展性和维护性。本篇文章将重点介绍四种常用的设计模式:策略模式、...
最后,"23种设计模式详解.ppt"可能是一个包含幻灯片形式的教程,它可能以简洁明了的方式展示了23种设计模式,每种模式的关键点、示例代码和应用场景可能都有所提及,对于快速回顾或教学来说非常方便。 通过阅读这些...
3. **设计模式详解**: - 深入分析各种设计模式,如工厂模式、单例模式、装饰者模式等,并探讨它们在Node.js中的应用场景。 - 通过实例展示如何在实际项目中应用这些模式来解决问题。 4. **构建模块化和可扩展的...
《Java与模式-清晰书签版》是一份包含多种Java设计模式详解的资源包,旨在帮助开发者深入理解和应用设计模式。这份资源集成了多种格式的文档,包括详细的文本描述、图表解析以及实际代码示例,使得学习过程更加直观...
在本书中,"HEAD_FIRST设计模式(中文版)"采用了易懂且生动的方式,将复杂的概念以图文并茂的形式呈现,使得读者能够更轻松地理解和掌握设计模式。以下是对几个关键设计模式的详解: 1. **工厂模式**:它是创建型...
"状态机设计模式详解" 在程序设计中,状态机是一种非常重要的概念。状态机是指程序在其生命周期内经过的一系列状态的抽象表示。今天,我们来讨论状态机的设计模式,特别是使用C语言实现状态机的策略。 传统的解决...
### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...
多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...
多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...
它以“傻瓜会计”的设计理念,用通俗易懂的方式替代复杂的会计术语,使得非专业会计人员也能快速上手。 该软件覆盖了多种行业,如百货、服装、汽配等,适应性强。其特色之一是提供了丰富的版本选择,包括单机版、...
书中不仅通过浅显易懂的文字和实例介绍了这些模式,还提供了丰富的UML图示和代码示例,以帮助读者更深入地理解每个设计模式的运用和实现。此外,本书还包括了Java线程基础内容的介绍、附录内容以及对每个设计模式的...
本文以通俗易懂的语言,详细介绍了23种设计模式。通过比喻和简单的例子,解释了每种设计模式的工作原理和用途,旨在帮助初学者理解并应用这些模式,以提高代码的质量和可维护性。 **适用人群**: 这篇文章适合编程...
本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...
在电子工程领域,差模电压和共模电压是两种重要的概念,主要应用于...在实际工作中,通过阅读"详解差模电压和共模电压-简单易懂.pdf"这份参考资料,可以深入学习这两个概念,掌握它们在电路设计中的应用和应对策略。