设计模式学习笔记(十一)——代理模式

定义: 为另一个对象提供一个替身或占位符以控制对这个对象的访问
分析: 我们可以将代理看作为另一个对象的“代表”,代理控制访问,如远程代理控制访问远程对象,虚拟代理控制访问创建开销大的对象,保护代理基于权限控制对资源的访问
UML类图
在这里插入图片描述
Subject: 为代理和实际对象提供了接口。通过实现同一接口,Proxy在realSubject出现的地方取代它。
RealSubject: 是真正做事的对象,它是被proxy代理和控制访问的对象
Proxy: 持有realSubject的引用,在某些例子中,proxy还会负责realSubject对象的创建和销毁。

示例

虚拟代理
Subject

public interface Icon {

    int getIconWidth();
    int getIconHeight();
    void paintIcon(final Component c, Graphics g, int x, int y);
}

proxy

public class ImageProxy implements Icon {
    ImageIcon imageIcon;
    URL imageURL;
    Thread retrievalThread;
    boolean retrieving = false;

    public ImageProxy(URL imageURL) {
        this.imageURL = imageURL;
    }

    @Override
    public int getIconWidth() {
        if (imageIcon != null){
            return imageIcon.getIconWidth();
        } else {
            return 800;
        }
    }

    @Override
    public int getIconHeight() {
        if (imageIcon != null){
            return imageIcon.getIconHeight();
        } else {
            return 600;
        }
    }

    @Override
    public void paintIcon(final Component c,Graphics g,int x,int y) {
        if (imageIcon != null){
            imageIcon.paintIcon(c,g,x,y);
        } else {
            g.drawString("加载中:",x+300,y+190);
            if (!retrieving){
                retrieving = true;
                retrievalThread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            imageIcon = new ImageIcon(imageURL,"CD Cover");
                            c.repaint();
                        } catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                });
                retrievalThread.start();
            }
        }
    }
}

realSubjcet

public class ImageIcon implements Icon {
    URL imageURL;
    String cdCover;

    public ImageIcon(URL imageURL, String cd_cover) {
        this.imageURL = imageURL;
        this.cdCover = cd_cover;
    }

    @Override
    public int getIconWidth() {
        return 0;
    }

    @Override
    public int getIconHeight() {
        return 0;
    }

    @Override
    public void paintIcon(final Component c, Graphics g, int x, int y) {

    }
}

我们做的工作:

  1. 创建ImageProxy,paintIcon方法被调用,创建线程并取得图像,并创建imageIcon
  2. 在某个时间点,图像被返回,imageIcon被完整实例化
  3. imageicon被创建后,下次调用到paintIcon时,代理就委托ImageIcon进行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值