模式的结构
代理模式的主要角色如下。
-
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
-
真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
-
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
静态代理:
抽象主题:
/**
* 抽象主题,房东
*
* 缺点:跟目标对象一样实现了抽象业务的接口,一旦抽象业务接口
* 发生改变也必须跟着改变,可以使用动态代理(反射机制)解决
* */
public interface HouseOwner {
/**
* 出租房屋
* */
public void rent();
/**
* 收租
* */
public void getMoney();
}
真实主题:
/**
* 具体主题 ,民防,城中存房东类
* */
public class VillageHouseOwner implements HouseOwner{
@Override
public void rent() {
System.out.println("出租单间一个月500,有热水器,有床,有独立卫生间,押一付一");
}
@Override
public void getMoney() {
System.out.println("收起每月月租,水电费,生活垃圾费");
}
}
代理类:
/**
* 代理类,房东代理类
* */
public class HouseOwnerProxy implements HouseOwner{
/**
* 代理类中定义目标类对象类的属性
* */
private HouseOwner houseOwner;
public HouseOwnerProxy(){
}
public HouseOwnerProxy(HouseOwner houseOwner){
this.houseOwner=houseOwner;
}
@Override
public void rent() {
houseOwner.rent();
getProxyFee();
}
@Override
public void getMoney() {
houseOwner.getMoney();
procedureFee();
}
public void getProxyFee(){
System.out.println("收取半个月的房租费当作中介费用,只收一次");
}
public void procedureFee(){
System.out.println("每个月固定收取手续费50块");
}
}
测试类:
public class Test {
public static void main(String[] args) {
//不适用代理,直接找到房东租房子,把房费直接交给房东
VillageHouseOwner villageHouseOwner = new VillageHouseOwner();
villageHouseOwner.rent();
villageHouseOwner.getMoney();
//使用代理,租客找到代理对象,创建一个代理类对象,构造方法中传入目标对象(被代理的对象)
HouseOwnerProxy proxy = new HouseOwnerProxy(new VillageHouseOwner());
//使用代理类租房子和收租金
proxy.rent();
proxy.getMoney();
}
}