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框架》(黄勇著)
© 版权声明:本文为博主原创文章,转载请注明出处