博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-代理模式学习笔记
阅读量:5110 次
发布时间:2019-06-13

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

前言:不包含动态代理

代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问。(代理类替代具体的实现类,代理类可根据需求添加内容而不用修改实现类)


 

  • 优缺点

优点:

  1. 满足了开闭原则
  2. 可扩展性高(当需求添加内容可通过代理类添加)
  3. 保护了实现类(可以隐藏并且不用修改),也增强了实现类的功能

缺点:

  1. 在实现类和调用类之间出现代理类,影响请求速度
  2. 类的数量增加,程序变得复杂

 

  • 结构

Subject:代理类和实现类的父类

RealSubject:具体的实现类,被代理对象

Proxy:代理类(代理对象,调用时被调用的对象)


 

  • 代码

引用《大话设计模式》中的例子,为人做嫁衣,一位同学想追求李娇娇同学,但是由于含羞,所以请另一位同学代为送礼物

    抽出父类

/** * @ Author     :fonxi * @ Date       :2019/5/13 5:11 * @ Description:代理和被代理对象的共同父类 */public interface GiveGift {    void giveDolls();    void giveFlowers();    void giveChocolate();}

    女孩类

/** * @ Author     :fonxi * @ Date       :2019/5/13 5:08 * @ Description:女孩 */public class SchoolGirl {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

 被代理对象,实现具体的操作

/** * @ Author     :fonxi * @ Date       :2019/5/13 5:08 * @ Description:被代理类  追求者类 */public class Pursuit implements GiveGift{    SchoolGirl mm;    public Pursuit(SchoolGirl mm){        this.mm = mm;    }    @Override    public void giveDolls() {        System.out.println(mm.getName()+"送你洋娃娃");    }    @Override    public void giveFlowers() { System.out.println(mm.getName()+"送你鲜花");    }    @Override    public void giveChocolate() {        System.out.println(mm.getName()+"送你巧克力");    }}

 代理对象,调用被代理对象的操作,并且可以提供增强的操作 

/** * @ Author     :fonxi * @ Date       :2019/5/13 5:12 * @ Description:代理类 */public class Proxy implements GiveGift{    Pursuit pursuit;    public Proxy(SchoolGirl mm){        pursuit = new Pursuit(mm);    }    @Override    public void giveDolls() { pursuit.giveDolls();    }    @Override    public void giveFlowers() { pursuit.giveFlowers();    }    @Override    public void giveChocolate() {        pursuit.giveChocolate();    }    //代理对象新增的操作    public void giveBook(){        System.out.println("送书");    }}

  

/** * @ Author     :fonxi * @ Date       :2019/5/13 5:15 * @ Description:客户端调用类 */public class TestController {    public void print(){        SchoolGirl mm = new SchoolGirl();        mm.setName("李娇娇");        Proxy proxy = new Proxy(mm);        proxy.giveDolls();        proxy.giveChocolate();        proxy.giveFlowers();        proxy.giveBook();    }}

  


 

  • 总结

代理模式可以让具体的操作对象被隐藏,并且可以在不修改操作对象的情况下扩展它的功能。

转载于:https://www.cnblogs.com/fonxi/p/10859992.html

你可能感兴趣的文章
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
遍历Map对象
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>