java之静态代理
© 版权声明:本文为博主原创文章,转载请注明出处
定义:
- 为其他对象提供一种代理以控制对这个对象的访问
组成:
抽象角色:通过接口或抽象类声明真正角色实现的业务方法
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作
优势:
- 1. 业务类只需要关注业务逻辑本身,保证了业务类的重用性
劣势:
- 1. 一个代理类只能代理一个接口,当需要代理的接口很多时就会创建很多的代理类,使得项目规模变大并且维护困难
- 2. 如果接口变了,那么实现类和代理类都需要相应的进行改动
实例:
1.项目结构

2.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.proxy</groupId>
<artifactId>StaticProxy</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies> </project>
3.Hello.java
package org.proxy.StaticProxy; /**
* 接口-抽象角色
*
*/
public interface Hello { void say(String name); }
4.HelloImpl.java
package org.proxy.StaticProxy; /**
* 实现类-真实角色
*
*/
public class HelloImpl implements Hello { public void say(String name) { System.out.println("Hello!" + name); } }
5.HelloProxy.java
package org.proxy.StaticProxy; /**
* 代理角色
*
*/
public class HelloProxy implements Hello { private Hello hello; public HelloProxy() { hello = new HelloImpl(); } public void say(String name) { before();
hello.say(name);
after(); } private void before() { System.out.println("Before"); } private void after() { System.out.println("After"); } }
6.TestStaticProxy.java
package org.proxy.test; import org.junit.Test;
import org.proxy.StaticProxy.Hello;
import org.proxy.StaticProxy.HelloProxy; public class TestStaticProxy { @Test
public void TestHello() { Hello helloProxy = new HelloProxy();
helloProxy.say("Jack"); } }
7.效果预览

参考:《架构探险-从零开始写Java Web框架》(黄勇著)
java之静态代理的更多相关文章
- Java基础-静态代理与动态代理比较
		
JAVA的静态代理与动态代理比较 静态代理类: 由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了.动态代理类: 在程序运行时,运用反射机制动态创建 ...
 - JAVA的静态代理与动态代理比较--转载
		
扩展:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/JAVA的静态代理与动态代理比较 一.概念 代理模式是常用的Java 设计模式,它的特 ...
 - java的静态代理、jdk动态代理和cglib动态代理
		
Java的代理就是客户端不再直接和委托类打交道,而是通过一个中间层来访问,这个中间层就是代理.使用代理有两个好处,一是可以隐藏委托类的实现:二是可以实现客户与委托类之间的解耦,在不修改委托类代码的情况 ...
 - Java 的静态代理 动态代理(JDK和cglib)
		
转载:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是 ...
 - java的静态代理和动态代理(jdk、cglib)
		
一.代理模式 代理的概念来自于设计模式中的代理模式,先了解一下代理模式 1.结构图 2.参与者 Subject:接口,定义代理类和实际类的共用接口 RealSubject:实际类,实现Subject这 ...
 - Java:静态代理 and 动态代理
		
代理模式是常用的设计模式,其特征是代理类与委托类具有相同的接口,在具体实现上,有静态代理和动态代理之分.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并 ...
 - java中静态代理,动态代理知识的补充
		
文章转载自:http://blog.csdn.net/jialinqiang/article/details/8950989 一.Java动态代理 相对于静态代理的代理类在编译时生成(.class文件 ...
 - java之静态代理和动态代理
		
我们以几个问题,来开始我们今天的学习,如果下面几个问题,你都能说出个一二,那么恭喜你,你已经掌握了这方面的知识.1,什么是代理模式?2,Java中,静态代理与动态代理的区别?3,Spring使用的是J ...
 - java之静态代理与动态代理
		
先看看静态代理是如何操作的 定义接口: public interface Person { public void sayHello(String content, int age); public ...
 - java中静态代理和动态代理
		
一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能 ...
 
随机推荐
- CI中SESSION的用法及其注意
			
销毁 Session要清除当前 session: $this->session->sess_destroy(); 注意: 此函数应该是最后被调用的.即使闪出变量已不再有效.如果你只想让某几 ...
 - 洛谷  P1064 金明的预算方案【有依赖的分组背包】
			
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱 ...
 - POJ 3264 Balanced Lineup(zkw线段树)
			
[题目链接] http://poj.org/problem?id=3264 [题目大意] 求区间最大值和最小值的差值 [题解] 线段树维护区间极值即可 [代码] #include <cstdio ...
 - centos下crontab的使用
			
1.作用 使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户. 2.格式 crontab [-u user] {-l | -r ...
 - C#练习DataReader(转载)
			
本文转自http://www.cnblogs.com/Mysterious/p/3422901.html SQL代码: create database ThreeDb go USE ThreeDb; ...
 - readlink命令
			
转:http://blog.csdn.net/zz198808/article/details/9319479 readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置. 在U ...
 - MessageFormat.format   字符串的模板替换
			
项目目前在消息的模版,模版中需要替换很多参数,比方说“用户名”,“日期”等等.不过目前没有想到更好的替换参数的方法,所以目前只能使用一个比较简单的方式来实现.这个方式太死板,参数对应必须要在代码中写死 ...
 - Linux下安装Eclipse的PHP插件(PHPEclipse)
			
下载: Eclipse: http://www.eclipse.org/downloads/ (本人用的Ubuntu,直接在SoftWare Center中下载的) (选择适合你系统的相应 ...
 - Java千百问_03基本的语法(005)_二进制是如何做位运算的
			
点击进入_很多其它_Java千百问 二进制是如何做位运算的 程序中的全部数在计算机内存中都是以二进制的形式储存的.位运算说白了,就是直接对整数在内存中的二进制位进行操作. 其它运算符看这里:java种 ...
 - Binder与interface
			
在Interface中,asBinder函数涌来将服务类接口类型转换为IBinder类型: 相反的,asInterface函数用来将Ibinder类型转换为服务接口类型