设计模式(JAVA)——Proxy模式

1. Proxy模式

代替别人进行工作,现在广泛应用在面向切面编程中。而且也不仅仅只做了代替工作,你会发现接下来示例程序中说的代理,其实是将“本人”的初始化进行了延迟,代理了一定的工作并不需要“本人”亲自去做,比如“告诉我你的名字”,这样的工作就已经交给了代理类去做。而现在使用的动态代理,面向切面编程中的代理类,是会在方法的前后做一些其他动作。

1.1 Proxy模式的类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VshS4NuQ-1575085182560)(./resources/image/21/21-1_Proxy.png)]

登场角色:

  • Subject(主体)
    定义了主体的API,代理类和实际类都会实现该接口

  • Proxy(代理人)
    RealSubject的代理角色

  • RealSubject(实际的主体)
    被代理的实际角色

  • Client(请求者)
    使用Proxy模式的类

1.2 类一览表

名字说明
Printable代理类和实际类的共同接口
Printer实际打印主体类
PrinterProxy代理打印类
Main测试类,代理模式的使用者

uml类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7dZhjmyV-1575085182561)(./resources/image/21/21-2.png)]

Printable接口

package xin.ajay.proxy;

public interface Printable {

    void setPrinterName(String name);//设置名字
    String getPrinterName();//获取名字
    void print(String msg);

}

Printer类

package xin.ajay.proxy;

public class Printer implements Printable {
    private String name ;



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

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

    @Override
    public void print(String msg) {
        System.out.println("=== " + name + " ===");
        System.out.println(msg);
    }


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

    private void heavyJob(String msg){
        System.out.println(msg);
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.print(".");

        }
        System.out.println("结束");
    }
}

PrinterProxy类

package xin.ajay.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 msg){
        realize();
        real.print(msg);
    }

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

Main类

package xin.ajay.proxy;

public class Main {

    public static void main(String[] args) {
        PrinterProxy p = new PrinterProxy("Alice");

        System.out.println("现在的名字是 " + p.getPrinterName() + "。");

        p.setPrinterName("Bob");

        System.out.println("现在的名字是 "+ p.getPrinterName() + "。");

        p.print("Hello,World.");


    }

}
鸣谢:

GoF《设计模式》和结城浩的《图解设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值