代理模式:

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

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

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

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

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

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

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

实例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. 【iCore3 双核心板_FPGA】例程六:计数器实验——计数器使用

    实验指导书及代码包下载: http://pan.baidu.com/s/1kUiAAt5 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  2. js中的text(),html() ,val()的区别

    js中的text(),html() ,val()的区别 text(),html() ,val()三个方法用于html元素的存值和取值,但是他们各有特点,text()用于html元素文本内容的存取,ht ...

  3. PHP 生成随机字符串与唯一字符串

    说明:生成随机字符串用到的方法有 mt_rand() 生成唯一字符串用到的方法有 md5(),uniqid(),microtime() 代码: <?php /* * 生成随机字符串 * @par ...

  4. 导入TDP数据包备份

    package org.alfresco.repo.bom.util; import java.io.BufferedReader; import java.io.File; import java. ...

  5. asp

    <%@LANGUAGE="%> <!--#include file="include.asp"--> <meta http-equiv=&q ...

  6. python display color output

    起因 在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也会在终端中显示,这样就搅乱了我们想 ...

  7. 【翻译】How To Tango With Django 1.5.4 第五章

    5数据模型和数据库 一个模型就是一个描述你数据表的python对象.不用再通过SQL来操作数据库,而是使用python对象来操作数据库. 5.1rango要求 ...一个目录下面有多个下面 ...一个 ...

  8. 控制Wordpress对搜索引擎的可见性

    网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,这些通过robots.txt体现. wordpress本身没有robots.txt,但是用根目录访问/robots.txt,如果 ...

  9. js 十分精确身份证验证

    checkIdcard:function (idcard) { // 1 "验证通过!", 0 //身份证号码校验错误 var Errors = new Array( " ...

  10. .NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式

    BidOpeningData.BidSupervisionSoapClient client = new BidOpeningData.BidSupervisionSoapClient(); Dict ...