一、什么是代理模式?
为其他对象提供一种代理机制以控制对这个对象的访问
二、什么时候使用代理模式?
(1)授权机制:不同级别的用户对同一对象拥有不同的访问权限,例如对于论坛中不同的访问权限。
(2)某个客户端不能直接操作某个对象但是又必须和这个对象接触。
三、代理模式的角色及职责
(1)代理接口:用于抽象代理的行为和方法。
(2)被代理角色:它是业务逻辑的具体实现者。
(3)代理角色:它把所有的接口的方法教给具体的被代理对象去实现,而自己仅仅实现一些善后和前置工作。
四:代理的实现形式
(1) 远程代理(Remote Proxy):可以隐藏一个对象存在于不同地址空间的事实。也使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
(2) 虚拟代理(Virtual Proxy):允许内存开销比较大的对象在需要的时候创建,即在真正需要使用该对象时才创建。
(3) 写入时复制代理(Copy-on-Write Proxy):用来控制对象的复制,方法是延时对象的复制,直到客户真的需要为止,它是虚拟代理的变体。
(4) 保护代理(Protection Proxy):为不同的客户提供不同级别的目标对象的访问权限。
(5) 缓存代理(Cache Proxy):为开销大的运算结果提供暂时存储,它允许多个客户共享结果,以减少计算或网络延时。
(6) 防火墙代理(Firewall Proxy):主要用于网络资源的访问,保护资源免于恶意客户的侵害。
(7) 同步代理(Synchronization Proxy):在多线程的情况下,为资源提供安全的访问。
(8) 智能引用代理(Smart ReferenceProxy):当一个对象被引用时,提供一些额外的操作,比如记录对象操作的次数。
(9) 复杂隐藏代理(Complexity HidingProxy):用于隐藏一个类的复杂集合的复杂度,并进行访问控制。该代理类似于外观模式。
五:具体实现举例:
package com.lt.exercise;
/*
* 代理接口:用于抽象代理的行为和方法
*/
public interface IPeople {
//写发言稿
public void write();
//发工资
public void salary();
//考核绩效
public void check();
/*
* 代理接口:用于抽象代理的行为和方法
*/
public interface IPeople {
//写发言稿
public void write();
//发工资
public void salary();
//考核绩效
public void check();
}
package com.lt.exercise;
/*
* 代理角色:他把所有接口类定义的方法给被代理者去实现,并在处理前后做一些预处理和善后工作。
*/
public class Boss implements IPeople {
@Override
public void write() {
System.out.println("老板写发言稿");
}
@Override
public void salary() {
System.out.println("老板发工资");
}
@Override
public void check() {
System.out.println("老板考核绩效");
}
}
/*
* 代理角色:他把所有接口类定义的方法给被代理者去实现,并在处理前后做一些预处理和善后工作。
*/
public class Boss implements IPeople {
@Override
public void write() {
System.out.println("老板写发言稿");
}
@Override
public void salary() {
System.out.println("老板发工资");
}
@Override
public void check() {
System.out.println("老板考核绩效");
}
}
package com.lt.exercise;
/*
* 代理角色:业务逻辑的具体实现者
*/
public class Assistant implements IPeople{
private Boss boss;
public Assistant(){
}
@Override
public void write() {
if(null==boss){
boss=new Boss();
}
boss.write();
}
@Override
public void salary() {
if(null==boss){
boss=new Boss();
}
boss.salary();
}
@Override
public void check() {
if(null==boss){
boss=new Boss();
}
boss.check();
}
public void driveAndDink(){
System.out.println("我是助理,我帮老板开车和喝酒");
}
}
/*
* 代理角色:业务逻辑的具体实现者
*/
public class Assistant implements IPeople{
private Boss boss;
public Assistant(){
}
@Override
public void write() {
if(null==boss){
boss=new Boss();
}
boss.write();
}
@Override
public void salary() {
if(null==boss){
boss=new Boss();
}
boss.salary();
}
@Override
public void check() {
if(null==boss){
boss=new Boss();
}
boss.check();
}
public void driveAndDink(){
System.out.println("我是助理,我帮老板开车和喝酒");
}
}
package com.lt.exercise;
public class Test {
public static void main(String[] args) {
Assistant assistant=new Assistant();
assistant.write();
assistant.check();
assistant.salary();
assistant.driveAndDink();
}
}
public static void main(String[] args) {
Assistant assistant=new Assistant();
assistant.write();
assistant.check();
assistant.salary();
assistant.driveAndDink();
}
}