java中的静态和动态代理模式

本文详细介绍了代理模式的概念及其在Java中的应用。通过静态代理和动态代理两种方式,展示了如何使用代理模式来控制对象的访问,并在不修改原始对象的前提下增加额外功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.  简介
代理模式(Proxy Pattern)是23种Java常用设计模式之一。
代理模式的定义:Provide a surrogate or placeholder for another 用代理模式创建代理对象,让代object to controlaccess to it
(为其他对象提供一种代理以控制对这个对象的访问)。使理对象控制目标
对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目
标对象的情况下添加一些额外的功能。


二、静态代理

1、首先创建一个借口 Humam,规定有唱歌,跳舞,吃饭三件事情
	public interface Human {
		
		void sing(float money);
		void dance(float money);
		void eat();
	}


     2、然后让一个人去实现这些功能

public class Person implements Human {

	public void sing(float money) {
		System.out.println("拿到钱"+money+"开始唱歌");
	}

	public void dance(float money) {
		System.out.println("拿到钱"+money+"开始跳舞");

	}

	public void eat() {
		System.out.println("吃饭");
	}


3、静态代理就是创建出一个具体的代理类,通过这个代理类,去实现接中规定的方法,这里给Person设计一个经纪人Middleman

  Middleman有对这个Human做出了一些规定。


      

public class Middleman implements Human {

		private Human h;
		public Middleman(Human h) {
			this.h = h;
		}
		public void sing(float money) {
			if(money>1000){
				h.sing(money/2);
			}
		}

		public void dance(float money) {
			if(money>2000){
				h.dance(money/2);
			}
		}

		public void eat() {
			h.eat();
		}
	}

4、测试

public static void main(String[] args){
			Human h = new Person();
			Human middleMan = new Middleman(h); 
			middleMan.sing(10000);
			middleMan.dance(20000);
			middleMan.eat();
		}


5、运行结果如下:

	拿到钱5000.0开始唱歌
	拿到钱10000.0开始跳舞
	吃饭

三、动态代理

1、2步 。同上
3、不需要代理类,在这个代码运行期间,动态的规定这些方法的实现。
public static void main(String[] args){
		//动态代理
		final Human h = new  Person();
		
		/**
		 * ClassLodder loader: 类加载器 和Person用相同的类
		 * Inferface[] interfaces Person用相同的接口
		 * InvocatoinHandler h :接口,设置代理,策略设计模式
		 * 
		 */
		Human middleman = (Human) Proxy.newProxyInstance(h.getClass().getClassLoader(),
			h.getClass().getInterfaces(), new InvocationHandler() {
				
				//匿名内部类:具体策略
				//只要执行任何方法,都会经过这里
		
				/*
				 * 返回值:当前方法的返回值
				 * Object proxy:当前代理对象的引用
				 * Method method:当前执行的方法
				 * Object[] args 当前执行方法的参数
				 */
				public Object invoke(Object proxy, Method method, Object[] args)
						throws Throwable {
				
					if("sing".equals(method.getName())){
						float money = (Float) args[0];
						if(money>1000){
							method.invoke(h, money/2);
						}
					
					}
					
					if("dance".equals(method.getName())){
						float money = (Float) args[0];
						if(money>2000){
							method.invoke(h, money/2);
						}
					}
					
					if("eat".equals(method.getName())){

						method.invoke(h, null);
					}
					return null;
				}
			});
		
		middleman.sing(10000);
		middleman.dance(20000);
		middleman.eat();
	}

4、运行结果:

	拿到钱5000.0开始唱歌
		拿到钱10000.0开始跳舞
		吃饭




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值