1、 代理模式的定义
定义 :Provide a surrogate or placeholder for another object to control access to it (为其他对象提供一种代理以控制对这个对象的访问)。
例如:我本人要找房子,但是房东我找不到,而代理人中介很容易找到,所以我能很轻易的通过中介进入房子。而这种服务模式就是代理模式。
《设计模式之禅》中有:代理模式也叫委托模式,它是一种基本设计技巧。许多其他的模式,如状态模式,策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制。动态代理,SpringAOP就是采用这个设计模式。
图中看到的类图中有三个主题类:Subject,RealSubject,Proxy等
在上图中看到的Subject可以是抽象类,也可以是接口,是一个最普通的业务类型定义,无特殊要求。
而据《Java模式》中介绍:代理模式有总类有:远程代理,虚拟代理,Copy-on-Write代理,保护代理,Cache代理,防火墙代理,同步化代理,智能引用代理等。针对这些不同的代理有什么不同,这里不是重点,待下次讨论。
2、代理模式的结构
代理模式所涉及的角色有:
抽象主体角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以使用代理主题。
代理主题角色:代理主题角色内部含有真实主题的引用,从而可以在任何时候操作真实主题对象:代理主题角色提供一个与真实主题角色相同的接口以便可以在任何时候都可以替代真实主题;控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端用传递给真实的主题之前或者之后,都要执行某个操作,而不是单纯的将调用传递给真实对象。
真实主题角色:定义了代理角色所代表的真实对象。---引用至《Java模式》。
一个代理类可以代理多个被委托者或被代理者,因此一个代理类具体代理哪个真实的角色,是由场景类决定的。最简单的情况就是一个主题类和一个代理类,这是最简单的代理模式。在通常情况下,一个接口只需要一个代理类就可以了,具体代理哪个实现类由高层模块来决定,也就是在代理类的构造函数中传递被代理者。该模式在实际的项目应用中比较广泛。
3、 代理模式的优点
1:职责清晰;真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。
2:高扩展性;具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱接口,那我们的代理类完全就可以在不做任何修改的情况下使用。
3:智能化,暂不讨论,因为我也没感觉到。感兴趣的可以看《设计模式之禅》P118-P119。
代理模式的时序图,如下:
相当于我问中介(代理人)找房子,中介(代理人)去找房东要钥匙。