设计模式(12):代理模式

本文介绍了Java中的代理模式,包括静态代理和动态代理的实现原理、应用场景(如安全代理、远程访问和延迟加载),以及JDK动态代理的具体使用。通过金南玲演出的例子,展示了如何在实际项目中运用代理模式来管理和控制对象的行为。

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

一.核心作用

  • 通过代理,控制对对象的访问;
  • 可以详细控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。

二.核心角色

  • 抽象角色: 定义代理角色和真实角色的公共对外方法;
  • 真实角色: 实现抽象角色,定义真实角色suo’yao实现的业务逻辑,供代理角色调用;
  • 代理角色: 实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制放到代理角色中处理。

三.应用场景

  • 安全代理: 屏蔽对真实角色的直接访问;
  • 远程访问: 通过代理类处理远程方法调用;
  • 延迟加载: 先加载轻量级的代理对象,真实需要再加载真实对象。

四.分类

  • 静态代理: 静态定义代理类
  • 动态代理: 动态生成代理类

五.动态代理类生成方式

  • JDK自带的动态代理;
  • CGLIB实现;
  • javaassist字节码操作库实现;
  • ASM(底层使用指令,可维护性较差)

六.动态代理相比静态代理的优点

  • 抽象角色中声明的所有方法都被转移到调用处理器一个集中的方法中处理,这样,我们可以更新灵活和统一的处理众多的方法。

七.JDK自带的动态代理

  • java.lang.reflect.Proxy
    • 动态生成代理类和对象;
  • java.lang.reflect.InvocationHandler
    • 可以通过invoke方法实现对真实角色的代理访问;
    • 每次通过Proxy生成代理类对象时都有指定对应的处理器对象

八.举例代码实现

  • 例:

    • 以金南铃演出为例,假如客户邀请金南玲演出唱歌,要做这些事情:面试、签合同、订票、唱歌、收钱。如果金南玲演出少,那么这些事情她自己就可以干;如果演出多,与每个客户合作她自己都有干这么多事,很繁琐;金南玲她自己主要业务就是唱歌,那么唱歌之前和之后的事都可以交给别人来做,很自然的就产生了经纪人概念。除了唱歌由金南玲本人来做,其它事情都交给经纪人做。这理的经纪人就是我们所说的代理。
  • 1.代码实现

    • 抽象角色类
/**
 * 抽象角色
 */
public interface Star {
	//面试
	void confer();
	//签合同
	void singContract();
	//订票
	void bookTicket();
	//唱歌
	void sing();
	//收尾款
	void collectMoney();
}
    • 真实角色类
/**
 * 真实角色
 */
public class RealStar implements Star {
	@Override
	public void confer() {
		System.out.println("面试");
	}
	@Override
	public void singContract() {
		System.out.println("签合同");
	}
	@Override
	public void bookTicket() {
		System.out.println("订票");
	}
	@Override
	public void sing() {
		System.out.println("金南铃本人演唱《逆流成河》");
	}
	@Override
	public void collectMoney() {
		System.out.println("收钱");
	}
}
    • 静态代理——代理角色
/**
 * 代理角色
 */
public class ProxyStar implements Star{
	private RealStar realstar;
	public ProxyStar(RealStar realstar) {
		this.realstar=realstar;
	}
	@Override
	public void confer() {
		System.out.println("面试");
	}
	@Override
	public void singContract() {
		System.out.println("签合同");
	}
	@Override
	public void bookTicket() {
		System.out.println("订票");
	}
	@Override
	public void sing() {
		realstar.sing();
	}
	@Override
	public void collectMoney() {
		System.out.println("收钱");
	}
}
    • 静态代理——客户调用
/**
 * 静态代理
 */
public static void main(String[] args) {
	RealStar realstar=new RealStar();
	ProxyStar proxystar=new ProxyStar(realstar);
	proxystar.confer();
	proxystar.singContract();
	proxystar.bookTicket();
	proxystar.sing();
	proxystar.collectMoney();
}
    • 动态代理——代理角色
/**
 *  动态代理实现代理模式
 *		 动态代理类 
 */
public class HandlerStar implements InvocationHandler,Star{
	private Star star;
	public HandlerStar(Star star) {
		this.star = star;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] o) throws Throwable {
		confer();
		singContract();
		bookTicket();
		Object invoke = method.invoke(star, o);
		collectMoney();
		return invoke;
	}
	@Override
	public void confer() {
		System.out.println("代理面试");
	}
	@Override
	public void singContract() {
		System.out.println("代理签合同");
	}
	@Override
	public void bookTicket() {
		System.out.println("代理订票");
	}
	@Override
	public void sing() {
	}
	@Override
	public void collectMoney() {
		System.out.println("代理收钱");
	}
}
    • 动态代理——客户调用
/**
 *  动态代理实现代理模式
 */
public static void main(String[] args) {
	Star star=new RealStar();
	HandlerStar handler=new HandlerStar(star);
	Star proxy=(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class} , handler);
	proxy.sing();
}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式(8):组合模式
          设计模式(9):外观模式
          设计模式(10):享元模式
          设计模式(11):适配器模式
          设计模式(12):代理模式
          设计模式(13):模板方法模式
          设计模式(14):命令模式
          设计模式(15):迭代器模式
          设计模式(16):观察者模式
          设计模式(17):中介者模式
          设计模式(18):状态模式
          设计模式(19):策略模式
          设计模式(20):责任链模式
          设计模式(21):备忘录模式
          设计模式(22):解释器模式
          设计模式(23):访问者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java的艺术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值