设计模式—代理模式

在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象 。
代理模式也叫委托模式,许多其他的模式,如状态模式,策略模式,访问者模式本质上是更加特殊的场合采用了委托模式

  • Subject(主题)
/**
 * 主题接口
 */
public interface Printable {
    // 设置名字
    void setPrinterName(String name);

    // 获取名字
    String getPrinterName();

    // 打印文字
    void print(String msg);
}
  • 实际主题
/**
 * 实际Subject
 */
public class Printer implements Printable {
    private String name;

    public Printer() {
        System.out.println("正在生成printer实例");
    }

    public Printer(String name) {
        this.name = name;
        System.out.println("正在生成printer实例(" + name + ")");
    }

    @Override
    public void setPrinterName(String name) {
        this.name = name;
    }

    @Override
    public String getPrinterName() {
        return this.name;
    }

    @Override
    public void print(String msg) {
        System.out.println("===============" + name + "====================");
        System.out.println(msg);
    }
}
  • 代理类
/**
 * 代理类
 */
public class PrinterProxy implements Printable {
    private Printer printer;

    public PrinterProxy(String name) {
        printer = new Printer(name);
    }

    @Override
    public void setPrinterName(String name) {
        printer.setPrinterName(name);
    }

    @Override
    public String getPrinterName() {
        return printer.getPrinterName();
    }

    @Override
    public void print(String msg) {
        printer.print(msg);
    }
}
  • 客户端
/**
 * 客户
 */
public class Client {
    public static void main(String[] args) {
        PrinterProxy printerProxy = new PrinterProxy("客户");
        printerProxy.print("打印信息");
    }
}

输出结果:

正在生成printer实例(客户)
=客户======
打印信息

与适配器模式的差别

适配器模式适用于两种具有不同接口的对象,使他们可以一起工作。

代理模式中代理者角色与真实主题角色的接口是相同的。

与装饰器模式的差别

代理模式与装饰器模式实现上相似,不过他们的使用目的不同。

装饰器模式的目的在于增加新的功能。在代理模式中,与增加新功能相比,他更加注重通过代理人的方式来减轻本人的工作负担。

posted @ 2023-06-20 20:18  弘一  阅读(22)  评论(0)    收藏  举报