java之静态代理

Posted 禁忌夜色153

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 反射之静态and动态代理

Spring之静态/动态代理模式

Java 设计模式之代理模式,Java 静态代理,Java 动态代理

Java动态代理之JDK实现和CGlib实现

java代码实现设计模式之代理模式