JavaProxy模式

本文最后更新于:1 年前

1 - Printer和PrinterProxy的共同接口

public interface Printable {
    public abstract void setPrinterName(String name);
    public abstract String getPrinterName();
    public abstract void print(String string);
}

2 - 表示带名字的打印机类(本人)

public class Printer implements Printable {
    private String name;
    public Printer() {
        heavyJob("正在生成Printer的实例");
    }

    public Printer(String name) {
        this.name = name;
        heavyJob("正在生成Printer的实例(" + name + ")");
    }

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

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

    @Override
    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 ignored) {
            }
            System.out.print('.');
        }
        System.out.println("结束!");
    }
}

3 - 表示带名字的打印机类(代理人)

public class PrinterProxy implements Printable{
    private String name;
    private Printer real;

    public PrinterProxy(){}

    public PrinterProxy(String name) {
        this.name = name;
    }

    @Override
    public synchronized void setPrinterName(String name) {
        if (real != null) {
            real.setPrinterName(name);
        }
        this.name = name;
    }

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

    @Override
    public void print(String string) {
        realize();
        real.print(string);
    }

    private synchronized void realize() {
        if (real == null) {
            real = new Printer(name);
        }
    }
}

4 - 测试程序行为的类

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.");
    }
}

5 - 输出示例

现在名字是Alice.
现在名字是Bob.
正在生成Printer的实例(Bob).....结束!
===Bob===
Hello, world.

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!