基于Java的设计模式 - 代理模式

这篇具有很好参考价值的文章主要介绍了基于Java的设计模式 - 代理模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式。简单来讲就是在不修改目标对象的基础上,增强主业务逻辑的设计模式。

代理模式基本可分为三种

  • 静态代理
  • JDK动态代理
  • CGLIB动态代理

上述简单分就是静态和动态代理,静态代理即程序运行之前已创建了代理类,动态代理是程序运行时通过反射机制动态创建代理对象。

静态代理

DoService.java

//主业务接口
public interface DoService {
	void doSomething();
}

DoServiceImpl.java

public class DoServiceImpl implements DoService {

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("业务操作");
	}

}

ServiceProxy.java

//代理类
public class ServiceProxy implements DoService {
	
	private DoService target;
	
	public ServiceProxy(){
		super();
		//创建目标对象
		target = new DoServiceImpl();
	}
	
	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("代理类--业务处理前操作");
		target.doSomething();
		System.out.println("代理类--业务处理后操作");
	}

}

TestStaticProxy.java

public class TestStaticProxy {
	public static void main(String[] args) {
		DoService service = new ServiceProxy();
		service.doSomething();
	}
}

JDK动态代理

DoService.java

//主业务接口
public interface DoService {
	void doSomething();
}

DoServiceImpl.java

public class DoServiceImpl implements DoService {

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("业务操作");
	}

}

TestJdkProxy.java

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class TestJdkProxy {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DoService target = new DoServiceImpl();
		// 使用JDK的Proxy动态代理,要求目标类必须实现接口
		// 因为其底层的执行原理,与静态代理相同
		DoService service = (DoService) Proxy.newProxyInstance(target.getClass().getClassLoader(), // 目标类的类加载器
			target.getClass().getInterfaces(), // 目标类所实现的所有接口
			new InvocationHandler() { // 匿名内部类

				// proxy:代理对象
				// method:目标方法
				// args 目标方法的参数列表
				@Override
				public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
					// TODO Auto-generated method stub
					System.out.println("代理类--业务处理前操作");
					// 调用目标方法
					Object result = method.invoke(target, args);
					System.out.println("代理类--业务处理后操作");
					return result;
				}
			});
		service.doSomething();
	}
}

使用jdk的proxy实现代理,要求目标类与代理类实现相同的接口,若目标类不存在接口,则无法使用该方式实现

CGLIB动态代理

DoService.java

//主业务
public class DoService {
	public void doSomething() {
		System.out.println("业务操作");
	}
}

MyCglibFactory.java

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class MyCglibFactory implements MethodInterceptor {

	private DoService target;
	
	public MyCglibFactory() {
		super();
		// TODO Auto-generated constructor stub
		target = new DoService();
	}
	
	public DoService MyCglibCreator(){
		//创建增强器对象
		Enhancer enhancer = new Enhancer(); 
		//指定目标类,即父类
		enhancer.setSuperclass(DoService.class);
		//设置回调接口对象
		enhancer.setCallback(this);
		
		return (DoService) enhancer.create();
	}
	
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("代理类--业务处理前操作");
		Object result = method.invoke(target, args);
		System.out.println("代理类--业务处理后操作");
		return result;
	}

}

TestCglibProxy.java

public class TestCglibProxy {
	public static void main(String[] args) {
		DoService service = new MyCglibFactory().MyCglibCreator();
		service.doSomething();
	}
}

对于无接口的类,要为其创建动态代理,就要使用CGLIB来实现,CGLIB代理的生成原理是生成目标类的子类,而子类是增强过,这个子类对象就是代理对象,所以使用CGLIB生成动态代理,要求目标必须能够被继承,即不能是final的类文章来源地址https://www.toymoban.com/news/detail-732952.html

到了这里,关于基于Java的设计模式 - 代理模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 与设计模式(13):代理模式

    代理模式是一种结构型设计模式,用于在访问对象时引入一个代理对象,以控制对实际对象的访问。代理对象充当了客户端和实际对象之间的中介,客户端通过代理对象间接地访问实际对象,从而可以在访问过程中添加额外的逻辑或控制。代理模式可以提供对实际对象的保护

    2024年02月09日
    浏览(37)
  • Java设计模式中的代理模式

    Java设计模式中的代理模式 代理模式是一种结构型设计模式,它提供了一个代理对象,以控制对其他对象的访问。代理可以充当中介,用于控制对真实对象的访问。 代码举例演示 静态代理: 动态代理 区别: 静态代理: 代理类在编译时就已经确定,并且需要为每个被代理的

    2024年01月25日
    浏览(46)
  • 【Java 设计模式】结构型之代理模式

    代理模式(Proxy Pattern)是一种结构型设计模式, 它允许通过一个代理对象控制对其他对象的访问 。代理模式在访问对象时引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的操作。在本文中,我们将深入研究Java中代理模式的定义、结构、使用场景以及如何在

    2024年01月21日
    浏览(48)
  • Java设计模式之代理模式--经纪人的工作

    本文主要讲述 代理模式 ,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。 代理模式是23种设计模式中 结构型模式 的一种,它的核心是通过代理类来完成其他对象的访问,降低访问者和被访问者的耦合度,也对功能进行了增强。 每个艺人

    2024年02月09日
    浏览(44)
  • Java复习-20-接口(3)- 代理设计模式

    功能:可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。 代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目标对象实现的基础上,增强额外的功能操作,即

    2024年02月09日
    浏览(38)
  • Java 设计者模式以及与Spring关系(四) 代理模式

    目录 简介: 23设计者模式以及重点模式 代理模式(Proxy Pattern) 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁,但不推荐) 2.基于CGLIB实现 spring中应用 本文是个系列一次会出两个设计者模式作用,如果有关联就三

    2024年01月23日
    浏览(49)
  • JAVA设计模式6:代理模式,用于控制对目标对象的访问

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。 代理模式是一种常用的设计模式,它提供了一个代理对象,用于控制对目标对象的访问 。 在代理模式

    2024年02月07日
    浏览(43)
  • 【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    代理模式 为一个对象提供一个代理对象,以控制对这个对象的访问 。即通过代理对象访问目标对象,这样做的好处是:可以在不修改目标对象代码的基础上,增强额外的功能操作,即扩展目标对象的功能 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对

    2024年02月14日
    浏览(43)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(52)
  • 【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

    掌握 抽象类和接口的定义、使用、区别、常见设计模式; 抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要覆写的方法,这样相当于在语法程度上对子类进行了严格的定义限制,代码的开发也就更加标准。下面具体介绍抽象类的概念。 普通类可以直

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包