代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问。
代理模式的详解
所谓代理就是一个人、或者一个机构代表另一个人、或者另一个机构完成规定的工作。在一些情况下,客户端不想、或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间作为中介,让客户端可以间接调用目标对象。
类图:
角色说明:
抽象对象角色(AbstractObject):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
目标对象角色(TargetObject):定义了代理对象所代表的目标对象。
代理对象角色(ProxyObject):代理对象内部含有目标对象的引用,从而可以在需要的时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在需要的时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后执行某个操作,而不是单纯地将调用传递给目标对象。
代码演示,抽象对象类:
public abstract class AbstractObject {
// 操作方法
public abstract void operation();
}
目标对象类:
public class TargetObject extends AbstractObject {
@Override
public void operation() {
// 目标对象的操作
System.out.println("目标对象的操作");
}
}
代理对象类:
public class ProxyObject extends AbstractObject {
TargetObject targetObject = new TargetObject();
@Override
public void operation() {
//找代理之前可以做相关操作
System.out.println("找代理之前的操作");
targetObject.operation();
// 找代理之后也可以做相关操作
System.out.println("找代理之后的操作");
}
}
客户端测试类:
public class Test {
public static void main(String[] args) {
AbstractObject obj = new ProxyObject();
obj.operation();
}
}
运行结果:
接下来结合形象的例子说明代理模式
一个家庭里,每个人都有做家务的责任。在这个家庭里主内的妈妈有绝对权,同时妈妈也实行了奖励机制,妈妈叫爸爸洗碗会奖励10块钱,妈妈叫儿子洗碗会奖励5块。但是这位爸爸有点鸡贼,每次妈妈叫他洗碗,他都会叫儿子代理洗,同时自己还赚5块钱。那么这个场景结合代理模式如何实现?!
类图:
代码演示,抽象家务类:
//抽象家务事类
public abstract class HouseWork {
// 洗碗方法
public abstract void washDishes();
}
儿子类:(这个类我使用了单例模式)
//继承家务事、单例模式的儿子类
public class Son extends HouseWork {
private Son(){}
//创建类的唯一实例
private static Son instance = new Son();
public static Son getInstance(){
return instance;
}
@Override
public void washDishes() {
System.out.println("我是儿子,我勤奋的刷碗!!!");
}
}
父亲类:
//家里每个人都有做家务的责任,继承家务事的父亲类
public class Father extends HouseWork {
@Override
public void washDishes() {
System.out.println("我是父亲,我接到老婆的命令,要洗碗了!");
//父亲叫儿子代理洗碗
Son.getInstance().washDishes();
System.out.println("我是父亲,我看着儿子把碗洗干净了!");
}
}
客户端测试类:
public class Test {
public static void main(String[] args) {
Father father = new Father();
father.washDishes();
}
}
运行结果:
代理模式的优点:
- 最直接的,可以使客户端间接的调用目标对象,这也是代理模式的特点。
- 系统扩展性和维护性增强,需求修改起来方便。