代理模式:

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

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

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

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

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

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

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

实例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. IOS第18天(7,CAKeyframeAnimation-图标抖动)

    *** #import "HMViewController.h" #define angle2radian(x) ((x) / 180.0 * M_PI) @interface H ...

  2. EntityFramework code first 一些常用的约束特性

    参阅: https://msdn.microsoft.com/zh-cn/data/jj591583 1. 主键 public class Test { //名称为 ID 的属性会自动映射为主键(自增 ...

  3. Jfianl

    http://www.oschina.net/question/257183_149268----------- 添加Handler: me.add(new ContextPathHandler(&q ...

  4. Windows Server 2008R2服务器安装及设置教程

    第一篇:系统安装与设置 前言本安装及设置教程适用于使用Windows2008R2为操作系统的服务器,目的是让服务器实现下列环境.语言脚本环境:ASP.ASP.Net1.1.ASP.Net2.0.ASP ...

  5. Nhiberate (三)测试

    (一)添加数据: public void AddUser(User user) { ISession session = NhibernateFactory.GetInstance().GetSess ...

  6. ELK+kafka构建日志收集系统

    ELK+kafka构建日志收集系统   原文  http://lx.wxqrcode.com/index.php/post/101.html   背景: 最近线上上了ELK,但是只用了一台Redis在 ...

  7. 使用Go开发HTTP中间件

    原文地址    再web开发的背景下,"中间件"通常意思是"包装原始应用并添加一些额外的功能的应用的一部分".这个概念似乎总是不被人理解,但是我认为中间件非常棒 ...

  8. LaTeX插入图表方法 Lists of tables and figures

    Lists of tables and figures A list of the tables and figures keep the information organized and prov ...

  9. ECStore在Win环境下如何运行CMD命令

    大多数程序员使用windows开发环境来做ECStore二次开发,经常需要使用 ECStore自带的cmd命令进行一些系统操作,如清除缓存(cacheclean),升级程序(update),创建新的a ...

  10. CRM 2011 Install Errors - Tips and Tricks continued(转)

    The more I get to install/upgrade to CRM 2011 in different environment the more I come across differ ...