第七章 设计模式之代理模式

代理模式定义

客户端想访问目标对象,为了控制客户端对目标对象的访问权限,还是由于目标对象存在多个,统一一种对目标对象的使用方式,所以在客户端和目标对象之间多了一个代理类。用代理类控制客户端对目标对象的访问。

代理模式的好处

1.可以控制对目标对象的访问权限,保证目标对象对客户端是透明的。

2.要是有多个目标对象的话,可以统一对目标对象的访问模式,客户端不需要提供对目标的多种处理方式,例如代理类利用反射就可以处理多种目标类,而只需要给客户端提供一种访问方式就行。

代理模式的主要类

被代理对象:客户端希望调用的对象,客户端想获取这个对象的信息或者想调用这个对象的某个功能。

代理对象:处在客户端和被代理对象之间,可以对被代理对象的访问做出控制,也可以对被代理对象的方法做一些额外处理。

客户端:请求的发起者,想访问被代理对象,但是需要经过代理对象。

抽象类:在静态代理和JDK动态代理中需要有一个被代理对象和代理对象都实现的接口。

代理模式分类

代理模式又分为动态代理和静态代理,动态代理又分为JDK代理和CGLIB代理,JDK动态代理需要被代理对象实现了接口,因为JDK动态代理锁创建的代理对象也要实现和被代理对象同样的接口,并重写接口方法,在接口方法中调用代理处理器来处理,代理处理器会用反射来调用被代理对象的相关方法。CGLIB动态代理会利用字节码形成一个新的class,这个class是继承被代理对象,并重写了被代理对象的相关方法,所以利用CGLIB动态代理功能的类不能是final类型的。

动态代理更加灵活,静态代理的效率会更高一些,但是静态代理每一个被代理对象都需要创建一个代理对象,增加了维护和开发成本。

静态代理是在编码的时候就已经形成的代理,

代理模式结构图

静态代理模式结构图

/**
 * 
 * @ClassName: TrainTicket
 * @Description: 抽象主题:火车票
 * @author: ljx
 * @date: 2019年2月28日 下午4:35:15
 */
public interface TrainTicket {
	public void buyTrainTicket();
}
/**
 * 
 * @ClassName: RealTrainTicket
 * @Description: 真实主题:购买火车票
 * @author: ljx
 * @date: 2019年2月28日 下午4:41:08
 */
public class RealTrainTicket implements TrainTicket {
 
	@Override
	public void buyTrainTicket() {
		System.out.println("购买火车票");
	}
 
}
/**
 * 
 * @ClassName: ProxyTrainTicket
 * @Description: 代理
 * @author: ljx
 * @date: 2019年2月28日 下午4:41:48
 */
public class ProxyTrainTicket implements TrainTicket{
 
	private RealTrainTicket realTrainTicket;
	
	public ProxyTrainTicket(RealTrainTicket realTrainTicket) {
		this.realTrainTicket = realTrainTicket;
	}
	
	@Override
	public void buyTrainTicket() {
		proxy12306Start();
		realTrainTicket.buyTrainTicket();
		proxy12306End();
	}
	
	public void proxy12306Start(){
		System.out.println("12306代购票开始");
	}
	
	public void proxy12306End(){
		System.out.println("12306代购票结束");
	}
	
}
//测试
public class ProxyTest {
	public static void main(String[] args) {
		TrainTicket t = new ProxyTrainTicket(new RealTrainTicket());
		t.buyTrainTicket();
	}
}

 参考文章:https://blog.csdn.net/qq594913801/article/details/88032470?spm=1001.2014.3001.5501

设计模式系列文章有点不想写,虽然有多一部分都是照着别人抄的,但还是不想写了,有点想看其他知识点了,后面还有单例模式,工厂模式,观察者模式就先放一放了。这个设计模式算是补四年前被中断了设计模式系列吧。其实我觉得设计模式在开发中刚开发一个需求是很少被动到的,除非你对这个需求模式特别熟悉,你一开始就能想到用什么设计模式,如果是一个不太熟悉的需求,当你做完,然后再进行优化的时候,可能你就会发现那些地方需要优化就可以用到设计模式了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值