java 代理模式一: 静态代理
代理模式:
代理模式的作用:为其他对象提供一种代理以控制对 特定对象 的访问。
某种情况下,一个客户不想或者直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用:通过代理对象引用。
代理模式一般涉及到的角色:
抽象角色:声明真实对象和代理对象的共同接口。可以是一个抽象类或者一个接口。
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便任何时候都能代替真实对象。
同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,完成实际操作。
实例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 代理模式一: 静态代理的更多相关文章
- java 代理模式(静态代理、动态代理、Cglib代理) 转载
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- Java三种代理模式:静态代理、动态代理和cglib代理
一.代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 简言之,代理模式就是 ...
- java代理模式之静态代理
作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等.所以了解代理模式对于 ...
- Spring框架_代理模式(静态代理,动态代理,cglib代理)
共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下: ...
- 【Java】代理模式,静态代理和动态代理(基于JDK或CGLib)
当我们需要在一个方法之前或之后添加一段逻辑时,自然会想到使用代理类.代理类帮我们代理了实际类的调用,然后可以在实际调用之前和之后添加一些逻辑,从而不浸入实际类. 拓展:由于代理类能在实际类调用之前和之 ...
- java 编程基础 Class对象 反射:代理模式和静态代理
生活中的代理 类(对象)代理模式 代理模式是面向对象编程中比较常见的设计模式. 1. 用户只关心接口功能,而不在乎谁提供了功能.上图中接口是 Subject 2. 接口真正实现者是上图的 RealSu ...
- Java的三种代理模式:静态代理/JDK动态代理/Cglib动态代理
1.静态代理:需要定义接口或者父类,目标对象与代理对象均实现同一接口或继承同一父类. 2.JDK动态代理:需要目标对象实现一个接口,通过动态反射的机制,生成代理对象,实现同一个接口 3.Cglib动态 ...
- 代理模式之静态代理,JDK动态代理和cglib动态代理
代理模式,顾名思义,就是通过代理去完成某些功能.比如,你需要购买火车票,不想跑那么远到火车站售票窗口买,可以去附近的火车票代售点买,或者到携程等第三方网站买.这个时候,我们就把火车站叫做目标对象或者委 ...
- 结构型模式 -- 代理模式(静态代理&动态代理)
静态代理: 真实角色和代理角色实现相同的接口,代理角色拥有真实角色的引用.代理角色去执行方法,对于某些"真正"需要真实角色自己执行的方法时,在代理角色内部就调用真实角色的方法,其他 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
随机推荐
- 临床试验中PI、CI、SI、COI是指哪些人?
今天为大家介绍的是临床试验的研究者的类型.临床试验的研究者是指在试验所在地负责实施临床试验的人员. 如果一项试验在试验场所由一组人员实施,研究者则为该组人员的负责人或领导者,也称之为主要研究者(Pri ...
- Properties类使用
package com.emolay.util; import java.io.IOException; import java.io.InputStream; import java.util.Pr ...
- 一键发布ASP.NET Web安装程序
转载自:http://www.cnblogs.com/nangong/p/Web.html 前言:最近公司有个Web要发布,但是以前都是由实施到甲方去发布,配置,这几天有点闲,同事让我搞 ...
- easyUI loyout tabs自适应宽度
index.html 页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- MySQL创建数据库并赋予权限
1.创建一个mysql用户并设置密码create user 'MySql用户名'@'localhost' identified by '密码';2.限制账户资源grant usage on *.* t ...
- Spring AOP 切面编程的方法
spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring ...
- spring设置webAppRootKey
今天一个同事来问webAppRootKey 在哪设置的 <context-param> <param-name>webAppRootKey</param-name> ...
- Linux:SSH错误"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! "
hadoop@master:~$ scp /home/hadoop/.ssh/authorized_keys node3:/home/hadoop/.ssh/ @@@@@@@@@@@@@@@@@@@@ ...
- Java -- 在Eclipse上使用Spring
在.NET上用的VS.NET+Spring.net+Nhibernate,到了Java平台上,自然对应着Eclipse+Spring+Hibernate.上一篇文章介绍了如何在Eclipse上使用Hi ...
- zjuoj 3601 Unrequited Love
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3601 Unrequited Love Time Limit: 16 Sec ...