一、什么是代理模式:
代理模式的设计动机是通过代理对象来访问真实对象,通过建立一个对象代理类,由代理对象控制原对象的引用,从而实现对真实对象的操作。在代理模式中,代理对象主要起到一个中介的作用,用于协调与连接调用者(即客户端)和被调用者(即目标对象),在一定程度上降低了系统的耦合度,同时也保护了目标对象。但缺点是在调用者与被调用者之间增加了代理对象,可能会造成请求的处理速度变慢。
二、UML结构图:
- Subject:抽象角色,声明了真实对象和代理对象的共同接口;
- Proxy:代理角色,实现了与真实对象相同的接口,所以在任何时刻都能够代理真实对象,并且代理对象内部包含了真实对象的引用,所以它可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。
- RealSubject:真实对象,是我们最终要引用的对象。
三、代码实现:
小时候你看到一个玩具,想让父母买,但是父母不会轻易给你买,这时候你就需要做点家务让父母开心才能拥有自己的小玩具。
首先就是父母类:
public class Parent {
String name;
public Parent(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后是抽象主题,做家务接口:
public interface Dohousework {
/**
* 做饭
*/
void cook();
/**
* 打扫卫生
*/
void cleaning();
/**
* 洗衣服
*/
void doTheLaundry();
}
你小子:
public class You implements Dohousework{
Parent parent ; //父母
public You(Parent parent){
this.parent = parent;
}
@Override
public void cook() {
System.out.println(parent.getName() +",我去做饭....");
}
@Override
public void cleaning() {
System.out.println(parent.getName() + ",我去打扫卫生....");
}
@Override
public void doTheLaundry() {
System.out.println(parent.getName() + ",我去洗衣服....");
}
}
妈妈:
public class Mom implements Dohousework{
You you;
public Mom(Parent parent){
you = new You(parent);
}
@Override
public void cook() {
you.cook();
}
@Override
public void cleaning() {
you.cleaning();
}
@Override
public void doTheLaundry() {
you.doTheLaundry();
}
}
测试:
public class Test {
public static void main(String[] args) {
Parent parent = new Parent("妈妈");
Mom mom = new Mom(parent);
mom.cook();
mom.cleaning();
mom.doTheLaundry();
}
}
结果:
四、代理模式与装饰器模式的区别:
代理模式跟装饰器模式比较类似,有些读者可能容易将他们混淆,这里我们简单介绍下两者的区别:
-
(1)装饰器模式关注于在对象上动态添加新行为,而代理模式虽然也可以增加新的行为,但关注于控制对象的访问。
-
(2)装饰器模式执行主体是原类;代理模式是代理原类进行操作,执行主体是代理类。
-
(3)代理模式中,代理类可以对客户端隐藏真实对象的具体信息,因此使用代理模式时,我们常常在代理类中创建真实对象的实例。而装饰器模式的通常做法是将原始对象作为参数传给装饰者的构造器。也就是说。代理模式的代理和真实对象之间的对象通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。