代理模式:

  代理模式的作用:为其他对象提供一种代理以控制对 特定对象  的访问。

  某种情况下,一个客户不想或者直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用:通过代理对象引用。

代理模式一般涉及到的角色:

  抽象角色:声明真实对象和代理对象的共同接口。可以是一个抽象类或者一个接口。

  代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便任何时候都能代替真实对象。

      同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

  真实角色:代理角色所代表的真实对象,完成实际操作。

实例1:

  抽象类角色:

/*
* 抽象类角色,可以定义一个接口或者抽象类
* 这是真实对象与代理对象的共同接口
*/
public abstract class Subject {
public abstract void request();
}

  真实角色:

/*
* 真实角色
* 实现接口,完成实际工作
*/
public class RealSubject extends Subject{ @Override
public void request() {
System.out.println("From Real Subject");
}
}

  代理角色:

/*
* 代理角色
* 内部包含着对真实对象的引用,并且封装功能
*/
public class ProxySubject extends Subject { //代理角色对象内部含有对真实对象的引用
private RealSubject realSubject; @Override
public void request() {
//在真实对象操作之前所附加的操作
preRequest(); if(null == realSubject){
realSubject = new RealSubject();
} //真实角色完成的事情
realSubject.request();
//真实角色操作之后附加的操作
postRequest(); } private void preRequest(){
System.out.println("Pre Request");
} private void postRequest(){
System.out.println("Post Request");
}
}

  客户端:

public class Client {
public static void main(String[] args) {
//实现代理类
Subject subject = new ProxySubject();
subject.request();
}
}

实例2:

  抽象类角色:

//接口
interface ClothFactory{
void productCloth();
}

  被代理类(也就是真是角色):

//被代理类,也就是真实类
class NikeClothFactory implements ClothFactory{
@Override
public void productCloth() {
System.out.println("Nike工厂生产一批衣服");
}
}

  代理类:

class ProxyFactory implements ClothFactory{
ClothFactory cf;
//创建代理对象时,实际传入一个被代理类对象
public ProxyFactory(ClothFactory cf){
this.cf = cf;
}
@Override
public void productCloth() {
System.out.println("代理类开始执行. 收取代理费");
cf.productCloth();
}
}

  客户端:

public class TestClothProduct {
public static void main(String[] args) {
//真实类创建
NikeClothFactory nike = new NikeClothFactory();
//代理类创建
ProxyFactory proxy = new ProxyFactory(nike);
//代理类完成真实类的工作
proxy.productCloth();
}
}

问题:

  静态代理的后果是:

    如果出现了大量的接口,那么代理类与真实类需要配对出现,造成类的急剧膨胀。这就需要使用java动态代理。

 

java 代理模式一: 静态代理的更多相关文章

  1. java 代理模式(静态代理、动态代理、Cglib代理) 转载

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  2. Java三种代理模式:静态代理、动态代理和cglib代理

    一.代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 简言之,代理模式就是 ...

  3. java代理模式之静态代理

    作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等.所以了解代理模式对于 ...

  4. Spring框架_代理模式(静态代理,动态代理,cglib代理)

    共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                 ...

  5. 【Java】代理模式,静态代理和动态代理(基于JDK或CGLib)

    当我们需要在一个方法之前或之后添加一段逻辑时,自然会想到使用代理类.代理类帮我们代理了实际类的调用,然后可以在实际调用之前和之后添加一些逻辑,从而不浸入实际类. 拓展:由于代理类能在实际类调用之前和之 ...

  6. java 编程基础 Class对象 反射:代理模式和静态代理

    生活中的代理 类(对象)代理模式 代理模式是面向对象编程中比较常见的设计模式. 1. 用户只关心接口功能,而不在乎谁提供了功能.上图中接口是 Subject 2. 接口真正实现者是上图的 RealSu ...

  7. Java的三种代理模式:静态代理/JDK动态代理/Cglib动态代理

    1.静态代理:需要定义接口或者父类,目标对象与代理对象均实现同一接口或继承同一父类. 2.JDK动态代理:需要目标对象实现一个接口,通过动态反射的机制,生成代理对象,实现同一个接口 3.Cglib动态 ...

  8. 代理模式之静态代理,JDK动态代理和cglib动态代理

    代理模式,顾名思义,就是通过代理去完成某些功能.比如,你需要购买火车票,不想跑那么远到火车站售票窗口买,可以去附近的火车票代售点买,或者到携程等第三方网站买.这个时候,我们就把火车站叫做目标对象或者委 ...

  9. 结构型模式 -- 代理模式(静态代理&动态代理)

    静态代理: 真实角色和代理角色实现相同的接口,代理角色拥有真实角色的引用.代理角色去执行方法,对于某些"真正"需要真实角色自己执行的方法时,在代理角色内部就调用真实角色的方法,其他 ...

  10. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

随机推荐

  1. oracle 11g 通过在线重定义方式修改表结构

    今天因为要对一套数据库的数据抽取进行io优化,希望通过修改表结构将抽取io降下来,因为抽取只针对标签HAVE_FLAG为"0"的值进行抽取,抽取之后更新HAVE_FLAG为其他值, ...

  2. Docker-compose命令详解

    语法: Define and run multi-container applications with Docker. Usage:   docker-compose [-f=<arg> ...

  3. 转贴: 更改Outlook2013数据文件的位置

    转自: 老田博客 近日体验了一下微软OFFICE 2013 说实话 除了与skydriver深度整合实现云同步文档外 其他的功能对我这样的『Light User』实在是大材小用 wps足够了 在使用过 ...

  4. ASP.NET Global Application_Error事件中访问Session报错 解决

    报错信息:会话状态在此上下文中不可用 protected void Application_Error(object sender, EventArgs e) { //以此判断是否可用Session ...

  5. SQL2008 SQL2012 远程连接配置方法

    第一步: SQL2008(或2012): 打开SQL Server Management Studio-->在左边[对象资源管理器]中选择第一项(主数据库引擎)-->右键-->方面- ...

  6. Python学习【第一篇】Python简介

    Python简介 Python前世今生 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 现在,全世界差不多有600多种编 ...

  7. mysql中OPTIMIZE TABLE的作用

    在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小.这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数据空 ...

  8. ios每日一发--Leanclude数据云存储以及登录 注册账户

    利用LeanCloud来实现注册账号,存储账号以及,登录时查询账号是否正确.集成方式很简单可以看这里的官方文档.地址是这里: https://leancloud.cn/docs/ 在这里创建应用,以及 ...

  9. Python Decorator 和函数式编程

    看到一篇翻译不错的文章,原文链接: Python Decorator 和函数式编程

  10. 简明python教程 --C++程序员的视角(二):函数及作用域

    函数通过def关键字定义.def关键字后跟一个函数的标识符名称,然后跟一对圆括号.圆括号之中可以包括一些变量名,该行以冒号结尾.接下来是一块语句,它们是函数体. 函数的基本概念 1 位置:从左往右进行 ...