模式说明
客户端不直接声明真实主题,而是声明代理类,通过调用代理类的方法来间接执行真实主题类的行为。
本示例中以代理售房为例,房东需要告知购房者房子类型和价格,但不直接告知购房者,而是通过代理来完成告知动作。代理类中持有房东实例,客户端只声明代理类,调用代理类实例中与房东类相同的方法来完成。房东类和代理类都是目标接口实现类,实现相同的抽象方法,代理类实现该抽象方法的方式是调用其持有的房东类的方法。
结构
抽象主题类
定义真实主题的方法。
具体主题类
继承抽象类,实现抽象方法。
代理类
内部持有一个具体主题类的实例,通过调用该具体主题实例的方法来实现抽象主题类的抽象方法。
代码演示
package com.yukiyama.pattern.structure;
/**
* 代理模式
*/
public class ProxyDemo {
public static void main(String[] args) {
// 声明一个房屋代理类
HouseAgent agent = new HouseAgent();
// 调用代理类的方法
// 输出“三室一厅”
agent.showHouse();
// 输出“100万”
agent.negotiatePrice();
}
}
/**
* 抽象主题类
* 下例为抽象房东类,有抽象展示房屋方法和抽象价格交涉方法。
*/
abstract class Subject{
public abstract void showHouse();
public abstract void negotiatePrice();
}
/**
* 具体主题类
* 继承抽象主题类,实现抽象方法。
* 下例为房东类。
*/
class HouseHolder extends Subject{
private String house;
private int price;
@Override
public void showHouse() {
house = "三室一厅";
System.out.println(house);
}
@Override
public void negotiatePrice() {
price = 100;
System.out.println(price + "万");
}
}
/**
* 代理类
* 持有一个具体主题类实例(房东),实现接口抽象方法,在内部调用真实主题的方法。
*/
class HouseAgent extends Subject{
HouseHolder holder = new HouseHolder();
@Override
public void showHouse() {
holder.showHouse();
}
@Override
public void negotiatePrice() {
holder.negotiatePrice();
}
}