1.含义
静态代理就是一个真实角色有一个代理角色
2.组成
抽象角色:代理角色和真实角色共同完成的事情,在租房模型中中介和房东都是租房,所以抽象角色就是租房;抽象角色一般用接口或抽象类完成
真实角色:被代理的角色,在租房模型中房东由中介代理租房,所以房东就是真实角色
代理角色:代理真实角色的角色,在租房模型中房东是真实角色,中介是代理房东的,所以中介就是代理角色;在代理真实角色后一般会做一些附属操作,也就是扩展功能
客户:访问代理角色的人,在租房模型中客户找中介租房,此客户即彼客户
3.模型
租房模型,一开始是客户和房东沟通,后来房东让中介代理租房,这时客户变成了找中介租房。
4.租房模型的代码实现
首先是还没有代理角色也就是中介的情况,这时候仅需要找房东租房就行了
//租房模型的抽象角色——租房
public interface Rent {
//租房的方法
public void rent();
}
//真实角色——房东
public class Host implements Rent{
public void rent(){
System.out.println("房东要租房子");
}
}
//客户,直接调用房东的租房方法找房东租房
public class Client {
public static void main(String[] args) {
Host host=new Host();
host.rent();
}
}
此时由于自己找房东太困难,中介应运而生,代理租房
//代理角色——中介
public class ProxyRole implements Rent{
private Host host;
//代理角色的无参构造和有参构造
ProxyRole(){
}
ProxyRole(Host host){
this.host=host;
}
//实现租房功能,根据不同房东的租房要求来租房
public void rent(){
host.rent();
}
}
客户找中介租房,选好房子后执行对应房东的租房要求
public class Client {
public static void main(String[] args) {
//获取指定的房东
Host host=new Host();
//中介根据指定的房东要求来租房给客户
ProxyRole pr=new ProxyRole(host);
pr.rent();
}
}
那既然直接找房东租房简单,为什么要有个代理呢?这是因为代理是可扩展的,能够扩展出除了主要功能外的其他功能。在这个租房的例子中,中介可以扩展出中介费、带领客户看房子的扩展功能,这些功能是房东不具有的
//扩展功能:看房子
public void seehouse(){
System.out.println("看房子");
}
//扩展功能:收中介费
public void paymore(){
System.out.println("收中介费");
}
然后客户就可以使用代理的扩展功能了
public class Client {
public static void main(String[] args) {
Host host=new Host();
ProxyRole pr=new ProxyRole(host);
//租房子
pr.rent();
//扩展功能,看房子和中介费
pr.seehouse();
pr.paymore();
}
}
运行结果 :
5.总结
从以上的例子中不难看出,代理模式的优点首先就是可扩展性高,并且能够使得真实角色功能纯粹,不需要关系其他服务;其次就是真实角色只负责主要功能,扩展功能交由代理角色实现,分工明确;最后就是所有扩展的功能都由代理角色实现,使得扩展功能方便集中管理。这也是静态代理的优点。
当然静态代理也有缺点,静态代理是一个真实角色对应一个代理角色,如果有多个真实角色就需要多个代理角色,会使得开发效率变低。比如租房需要租房中介,二手车需要二手车中介等,这就需要编写许多的中介代理,开发难度就变高了。