Design Pattern
  • GoF设计模式讲解与实现
  • 设计模式一览
  • 创建型设计模式
    • 单例模式
    • 原型模式
    • 简单工厂模式
    • 工厂方法模式
    • 建造者模式
    • 抽象工厂模式
  • 结构型设计模式
    • 代理模式
    • 适配器模式
    • 桥接模式
    • 装饰器模式
    • 外观模式
    • 享元模式
    • 组合模式
  • 行为型设计模式
    • 模板方法模式
    • 策略模式
    • 命令模式
    • 责任链模式
    • 状态模式
    • 观察者模式
    • 中介者模式
    • 迭代器模式
    • 访问者模式
    • 备忘录模式
    • 解释器模式
Powered by GitBook
On this page
  • 模式说明
  • 结构
  • 代码演示
  1. 结构型设计模式

代理模式

模式说明

客户端不直接声明真实主题,而是声明代理类,通过调用代理类的方法来间接执行真实主题类的行为。

本示例中以代理售房为例,房东需要告知购房者房子类型和价格,但不直接告知购房者,而是通过代理来完成告知动作。代理类中持有房东实例,客户端只声明代理类,调用代理类实例中与房东类相同的方法来完成。房东类和代理类都是目标接口实现类,实现相同的抽象方法,代理类实现该抽象方法的方式是调用其持有的房东类的方法。

结构

抽象主题类: 定义真实主题的方法。 具体主题类: 继承抽象类,实现抽象方法。 代理类: 内部持有一个具体主题类的实例,通过调用该具体主题实例的方法来实现抽象主题类的抽象方法。

代码演示

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();
    }
}
Previous结构型设计模式Next适配器模式

Last updated 2 years ago