1 内容
客户端不直接调用实际对象方法.而是通过调用代理对象方法,来间接调用实际对象方法.类似现实生活中租房子的人去房产中介公司找中介人员获取房源信息,签订租房合约.
2 为什么用代理模式?
(1)隔离作用
租房客户只关心房源在哪儿不关心房主是什么.
(2)开闭原则
代理类不光是客户类和委托类的中介,还可以增加额外功能.中介公司工作人员还可以提供房屋水管家具维修服务.
3 优缺点
优点
(1)将代理对与真是对象被调用的目标对象分离
(2)降低系统耦合性,扩展性好
(3)保护目标对象
(4)增强目标对象
缺点
(1)造成系统设计中类的数目增加
(2)在客户端和目标对象增加一个代理对象,请求处理速度变慢
(3)增加了系统复杂度(空间-时间)
4 分类
(1)静态代理
使用房产中介例子,代码实现如下.
step 1 公共接口-获取房屋信息
package com.whl.proxy;
/**
* @author whl
* @date 2020/9/9
* 公共接口 定义租房业务具备的功能
*/
public interface Rent {
/**
* 提供房子信息
*/
public String avialibleRoomMessage();
}
step 2 委托类-老高-实现公共接口
package com.whl.proxy;
/**
* @author whl
* @date 2020/9/9
*/
/**
* 被代理角色 老高
*/
public class OldGao implements Rent {
/**
* 老高提供自己要出租的房子信息
*/
@Override
public String avialibleRoomMessage() {
String message = "room message :one room,1000 yuan one month,1511146xxxx.";
return message;
}
}
step 3 代理类-房产中介公司-实现公共接口
重要,因为看不懂这里??我的问题有…
q1 为什么要写一个接口,再写委托类实现接口,代理类实现接口?
就像jdbc接口写好,不同数据库厂商实现接口.**接口代表功能集合,规定要实现的功能内容.**
Rent接口中的avialibleRoomMessage规定要获取有用的房源信息String.
委托类要实现Rent接口中的功能,提供自己的房屋信息给调用者String.
代理类要实现Rent接口中的功能,调用委托对象avialibleRoomMessage,再给调用者.他只是这样简单的存在.
q2 为什么代理类写个构造方法传参?
这个构造方法中的参数代表委托类.房产中介公司需要知道房主.才能获取房主的空闲房屋信息.
写法,可以直接在内部Rent rent = new OldGao();构造方法的话,我的理解就是更加灵活,没写死.
q3 是否必须实现公共接口?
是的.所以他就是实现了一个接口.不能动态增加其他功能,比如打扫房屋.
package com.whl.proxy;
/**
* @author whl
* @date 2020/9/9
*/
/**
* 代理角色 房产中介公司
*/
public class StaticProxyRentCompany implements Rent{
/**
* 被代理角色
*/
private Rent rent;
public StaticProxyRentCompany(Rent rent) {
this.rent = rent;
}
@Override
public String avialibleRoomMessage() {
System.out.println("Company find avialable room message for customer...");
String message = this.rent.avialibleRoomMessage();
return message;
}
}
step 4 测试类
找中介,获取房屋信息
Rent rent = new StaticProxyRentCompany(ne