【Java学习笔记】设计模式21——Proxy(代理人)模式

该文章是阅读《图解设计模式》的学习笔记。书本链接https://www.ituring.com.cn/book/1811

    代理人是指代替别人工作的人,在日常生活中,当本人太忙无法完成当前工作时,就可以请一个代理人代替本人去完成;但毕竟是代理工作的人,所以有代理人无法完成的工作仍然会交回本人去完成。

    而在面向对象编程中,可以将“本人”和“代理人”都理解为对象。如果“本人”对象太忙了,有些工作无法亲自完成,就会交给“代理人”对象负责完成,如果“代理人”对象无法完成当前工作,就将工作返回给“本人”对象完成。

 Printable接口代码:

package com.wen.proxy;

public interface Printable {
    public abstract void setPrinterName(String name);   // 设置名字
    public abstract String getPrinterName();            // 获取名字
    public abstract void print(String string);          // 显示文字(打印输出)
}

  Printer类代码:

package com.wen.proxy;

public class Printer implements Printable {
    private String name;
    public Printer() {
        heavyJob("正在生成Printer的实例");
    }
    public Printer(String name) {                   // 构造函数
        this.name = name;
        heavyJob("正在生成Printer的实例(" + name + ")");
    }
    public void setPrinterName(String name) {       // 设置名字
        this.name = name;
    }
    public String getPrinterName() {                // 获取名字
        return name;
    }
    public void print(String string) {              // 显示带打印机名字的文字
        System.out.println("=== " + name + " ===");
        System.out.println(string);
    }
    private void heavyJob(String msg) {             // 重活
        System.out.print(msg);
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            System.out.print(".");
        }
        System.out.println("结束。");
    }
}

PrinterProxy类代码:

package com.wen.proxy;

public class PrinterProxy implements Printable {
    private String name;            // 名字
    private Printer real;           // “本人”
    public PrinterProxy() {
    }
    public PrinterProxy(String name) {      // 构造函数
        this.name = name;
    }
    public synchronized void setPrinterName(String name) {  // 设置名字
        if (real != null) {
            real.setPrinterName(name);  // 同时设置“本人”的名字
        }
        this.name = name;
    }
    public String getPrinterName() {    // 获取名字
        return name;
    }
    public void print(String string) {  // 显示
        realize();
        real.print(string);
    }
    private synchronized void realize() {   // 生成“本人”
        if (real == null) {
            real = new Printer(name);
        }
    }
}

 Main程序入口类:

package com.wen.proxy;

public class Main {
    public static void main(String[] args) {
        Printable p = new PrinterProxy("Alice");
        System.out.println("现在的名字是" + p.getPrinterName() + "。");
        p.setPrinterName("Bob");
        System.out.println("现在的名字是" + p.getPrinterName() + "。");
        p.print("Hello, world.");
    }
}

程序运行结果: 

模式中的角色: 

Subject(主体):定义了使Proxy角色和RealSubject角色之间具有一致性的接口,由于存在Subject角色,所以Client角色不必在意它所使用的究竟是Proxy角色还是RealSubject角色。如上面代码中的Printable类。

Proxy(代理人):实现Subject了Proxy角色中定义的接口。尽量处理来自Client角色的请求,只有当自己不能处理时,会将工作交给RealSubject角色。如上面代码中的PrinterProxy类、

RealSubject(实际的主体):实现了Proxy角色中定义的接口方法,该角色会在Proxy代理人角色无法胜任工作时出场。如上面代码中的Printer类。

Client(请求者):使用Proxy模式的角色,该角色不包含在Proxy模式中。如上面代码中的Main类。

发布了54 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_35800355/article/details/105649804