代理模式:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
UML图:
角色:
抽象角色(Subject):它是一个由真实角色实现的接口,并能够表征真实角色的功能。该接口同时也必须由代理角色所实现,这样代理角色就能够用于所有真实角色能够使用的地方
代理角色(Proxy):它维护了能够允许代理角色访问真实角色的引用。代理角色与真实角色都实现了同一个接口,这样代理角色就能够代替真实角色,实现对真实结算的访问控制并负责数据的创建和删除。
真实角色(RealSubject):这是代理角色所代表的真实对象。
代码实操:
抽象角色:声明一个Perform接口,提供一个sing的方法
/**
*@Author ZNX
*@Date 2018/10/9 23:28
*@Description:抽象角色,用来确保代理与被代理的行为的一致性
*
*/
public interface Perform {
void sing();
}
真实角色:Star类,实现Perform接口
/**
*@Author ZNX
*@Date 2018/10/9 23:31
*@Description:真实角色,目标对象
*/
public class Star implements Perform {
private String name;
public Star(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void sing() {
System.out.println(name+" sing ");
}
}
代理角色:也实现Perform接口:
/**
*@Author ZNX
*@Date 2018/10/9 23:32
*@Description:代理类
*/
public class Agent implements Perform {
private Star target; //被代理的对象,建立起与被代理之间的关系
public Star getTarget() {
return target;
}
public void setTarget(Star target) {
this.target = target;
}
@Override
public void sing() {
System.out.println("其他业务逻辑A");
this.target.sing();//目标逻辑
System.out.println("其他业务逻辑B");
}
}
测试:
public class Client {
public static void main(String[] args) {
//静态代理模式
//创建好目标和代理,并建立关系
Star star = new Star("张三");
Agent agent = new Agent();
agent.setTarget(star);
agent.sing();
}
}
优点:
1.协调调用者与被调用者,降低了系统的耦合度
2.代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用
缺点:
1.由于在客户端和真实角色之间增加了代理对象,因此会造成请求的处理速度变慢
2.实现代理模式需要额外的工作,从而增加了系统 的复杂性
使用场景:
1.远程代理 2.虚拟代理 3.Copy-on-Write代理 4.保护代理 5.Cache代理 6.防火墙代理 7.同步化代理 8.智能引用代理