博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式梳理——代理模式
阅读量:4096 次
发布时间:2019-05-25

本文共 1968 字,大约阅读时间需要 6 分钟。

一、概述

       代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。 

二、UML图示

三、编程实现

       该程序主要通过模拟代理追求女生的功能实现。

1、统一接口类

public interface GiveGift {    void giveDolls();    void giveFlowers();    void giveChocolate();}

2、追求者类

public class Pursuer implements GiveGift {    SchoolGirl schoolGirl;    public Pursuer(SchoolGirl schoolGirl){        this.schoolGirl = schoolGirl;    }    @Override    public void giveDolls() {        System.out.println(schoolGirl.getName() + ",送你娃娃!");    }    @Override    public void giveFlowers() {        System.out.println(schoolGirl.getName() + ",送你鲜花!");    }    @Override    public void giveChocolate() {        System.out.println(schoolGirl.getName() + ",送你巧克力!");    }}

3、代理

public class Proxy implements GiveGift {    Pursuer pursuer;    public Proxy(SchoolGirl schoolGirl){        this.pursuer = new Pursuer(schoolGirl);    }    @Override    public void giveDolls() {        pursuer.giveDolls();    }    @Override    public void giveFlowers() {        pursuer.giveFlowers();    }    @Override    public void giveChocolate() {        pursuer.giveChocolate();    }}

4、被追求者

public class SchoolGirl {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

5、测试

public class Test {    public static void main(String[] args) {        SchoolGirl sg = new SchoolGirl();        sg.setName("娇娇");        Proxy proxy = new Proxy(sg);        proxy.giveDolls();        proxy.giveFlowers();        proxy.giveChocolate();    }}输出:娇娇,送你娃娃!娇娇,送你鲜花!娇娇,送你巧克力!

四、应用场景

  • 当需要为一个对象再不同的地址空间提供局部的代表时 

    此时的代理模式称为远程代理:为一个对象在不同的地址空间提供局部代表。

    目的:

    1. 隐藏一个对象存在于不同地址空间的事实;
    2. 远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
  • 当需要创建开销非常大的对象时 

    此时的代理模式称为虚拟代理:通过使用过一个小的对象代理一个大对象。

    目的:减少系统的开销。

  • 当需要控制对原始对象的访问时 
    此时的代理模式称为保护代理:控制目标对象的访问,给不同用户提供不同的访问权限 

    目的:用来控制对真实对象的访问权限

  • 当需要在访问对象时附加额外操作时 
    此时的代理模式称为智能引用代理,额外操作包括耗时操作、计算访问次数等等 
    目的:在不影响对象类的情况下,在访问对象时进行更多的操作

以上是最常用的使用场景,其他还包括:

  • 防火墙代理:保护目标不让恶意用户靠近
  • Cache代理:为结果提供临时的存储空间,以便其他客户端调用 

注:参考文献《大话设计模式》程杰著。

你可能感兴趣的文章
实现接口创建线程
查看>>
Java对象序列化与反序列化(1)
查看>>
HTML5的表单验证实例
查看>>
JavaScript入门笔记:全选功能的实现
查看>>
程序设计方法概述:从面相对象到面向功能到面向对象
查看>>
数据库事务
查看>>
JavaScript基础1:JavaScript 错误 - Throw、Try 和 Catch
查看>>
SQL基础总结——20150730
查看>>
SQL join
查看>>
JavaScript实现页面无刷新让时间走动
查看>>
CSS实例:Tab选项卡效果
查看>>
前端设计之特效表单
查看>>
前端设计之CSS布局:上中下三栏自适应高度CSS布局
查看>>
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
pinyin4j:拼音与汉字的转换实例
查看>>
XML工具代码:SAX从String字符串XML内获取指定节点或属性的值
查看>>
时间日期:获取两个日期相差几天
查看>>
责任链模式 Chain of Responsibility
查看>>
高并发与大数据解决方案概述
查看>>