本文已参与「新人创作礼」活动,一起开启掘金创作之路。 代理是接口的应用,为其他的对象提供一种控制对这其访问的方式,使用接口作为桥梁。
package com.hike.javase.interfacetest;
/**
* 代理模式:把代理对象当成代理对象来使用
*
* 使用场景1:
* 无法直接使用被代理对象时。例如租房子时,中介是代理对象,房东是被代理对象,
* 中介和房东之间需要通过接口来连接,无论是房东还是中介,统一看做可租房子的人。
*
* 使用场景2:
* 增强被代理对象的方法,同时又不能修改被代理类,通过代理类增强业务方法,比如:
* 租房子时可以支持微信支付宝,应用见HeiZhongJie类。
* 面向切面编程(AOP),可扩充性强。连接的不仅仅是中介和房东,更是与客户端相连接,统一为接口类型。
*/
interface HouseRent{
void rent();
}
class FangDong implements HouseRent{
@Override
public void rent(){
System.out.println("我是房东,有房子,但找不到人");
}
}
class FangDong2 implements HouseRent{
@Override
public void rent(){
System.out.println("我是房东2,有房子,但找不到人");
}
}
class HeiZhongJie implements HouseRent{
//关联被代理对象
private HouseRent houserent = new FangDong2();
@Override
public void rent() {
System.out.println("我是中介,我没有房子,但我有房源,请交中介费");
houserent.rent(); //被代理对象的方法调用,是一个插件、切面,无论上下怎么变化,此句不变。称为面向切面编程AOP。
System.out.println("请及时交房租");
System.out.println("支持微信支付宝:XXX");// 使用场景 2 的应用
}
}
public class ProxyTest {
public static void main(String[] args) {
//客户要租房
HouseRent houserent = new HeiZhongJie(); //面向接口编程,不看子类的特性,只看它的接口
houserent.rent();
}
}