java之静态代理

? 版权声明:本文为博主原创文章,转载请注明出处

定义:

  - 为其他对象提供一种代理以控制对这个对象的访问

组成:

  抽象角色:通过接口或抽象类声明真正角色实现的业务方法

  真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用

  代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作

实例:

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框架》(黄勇著)

时间: 2024-11-10 08:24:56

java之静态代理的相关文章

java的静态代理和动态代理(jdk、cglib)

一.代理模式 代理的概念来自于设计模式中的代理模式,先了解一下代理模式 1.结构图 2.参与者 Subject:接口,定义代理类和实际类的共用接口 RealSubject:实际类,实现Subject这个接口 Proxy:代理类,实现Subject这个接口,内部引用一个RealSubject实际类 3.描述 Proxy实现了Subject接口,内部引用一个RealSubject实际类,RealSubject能做的Proxy都会 于是Proxy代替了RealSubject,实例化到Subject里交

Java:静态代理and动态代理

代理模式是常用的设计模式,其特征是代理类与委托类具有相同的接口,在具体实现上,有静态代理和动态代理之分.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务,也就是说代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 静态代理和动态代理的一个显著区别: 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就

Java基础-静态代理以及动态代理

动态代理: 在了解动态代理之前,先对代理有一个认识. 代理模式是Java常见的设计模式之一.所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 打个比方:你买火车票的时候,并不直接花钱购买, 而是将钱预先垫付到抢票软件上, 使抢票软件为你购买, 你要做的行为就是买票,抢票软件就是你的代理 代理对象控制对被代理对象的访问: 这是代理的通用模型图 Subject:定义了被代理角色和代理角色的共同接口或者抽象类,也就是subject中定义了共同接口opration

java中静态代理和动态代理

一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能的特点也为多人所用. 按照代理的创建时期,代理类可以分为两种: 静态:由程序员创建代理类或特定工具自动生成源代码再对其编译.在程序运行前代理类的.class文件就已经存在了. 动态:在程序运行时运用反射机制动态创建而成. 我们根据加载被代理类的时机不同,将代理分为静态代理和动态代理.如果我们在代码编

java的静态代理

解决这个问题:在多个模块要插入一段功能,比方,在不同业务处理模块中,都须要检查用户是否登录,假设不使用代理的话,每添加一个模块,就须要添加非常多代码. 比方,除了推断是否登录,假设还须要添加一个记录日志的功能,那么每一个模块都须要又一次添加一个函数. 以下我们利用静态代理的功能来解决这个需求. 代码结构 功能函数接口 package itbuluoge.proxy; public interface ICompent { public void bussiness1(); public void

Java之静态代理模式

静态代理模式:这种模式可以实现帮助被代理者完成一些前期的准备工作和后期的善后工作,但是核心的业务逻辑仍然是由被代理者完成. 代码结构由三部分组成 (1)接口:主题 (2)代理类 (3)被代理类 实现方式:代理类和被代理类要实现同一个主题接口,而且代理类中要有一个被代理类的属性(target),这样才能把核心业务逻辑交还给被代理类完成:而一些与核心业务逻辑无关的逻辑,并且需求是多变的,那么这些逻辑就可以交给代理类来完成 示例 需求:计算add()的运行时间 public class StaticP

java静态代理与动态代理

原文链接:http://www.orlion.ga/207/ 一.代理模式 代理模式是经常用到的设计模式,代理模式是给指定对象提供代理对象.由代理对象来控制具体对象的引用. 代理模式涉及到的角色: 抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 代理主题角色:含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实

深入浅出java静态代理和动态代理

首先介绍一下,什么是代理: 代理模式,是常用的设计模式.特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类.以及事后处理消息. 代理类和委托类,存在着关联关系.代理类的对象本身并不真正实现服务,知识通过调用委托类的对象的相关方法. 代理类可以分为两种:静态代理和动态代理. 静态代理: 代理类是由程序员创建,或由工具生成的代码 编译成的.在程序运行前,代理类的 *.class文件已经存在了.直接就可以运行 . 动态代理: 动态代理的代理类.没有直接由

【Java】代处理?代理模式 - 静态代理,动态代理

>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算,见[Java]Float计算不准确) package com.nicchagil.study.java.demo.No09代理.No01不用代理; import java.math.BigDecimal; public class FloatCalculator { public float add(fl