设计模式(四)—— 代理模式

(静态)代理模式


  • 介绍a

    • 结构图:
      在这里插入图片描述
  • 定义
    代理模式为其他对象提供一种代理以控制对这个对象的访问
  • (自我总结)核心:
    • 顶层方法接口
    • 代理对象类
    • 实际对象类
  • 特点:
    在保留一个类的基本功能的同时,可以通过代理方式对其方法进行增强,起到职责分明功能加强的作用
  • 使用场景(这种思想不仅仅运用于代码中
    • 远程代理,为一个对象在不同的地址空间起到局部代表,这样可以隐藏一个对象存在于不同地址空间的事实
    • 虚拟代理,比如各种占位情况(图片的预加载占位等等)
    • 安全代理,比较常用,在真正功能调用前进行安全验证
    • 功能拓展,比如日志输出、打印、字符串修改等等

  • 实例

采用《大话设计模式》的实例
TheReal通过TheProxy给Girl送礼物的过程

一、结构图

在这里插入图片描述

结合图和下面的代码,我们发现每次调用Proxy的方法,其实正在完成功能的是TheReal对象
广义上看TheProxy就仅仅就是调用TheReal,但是因此我们可以调用前后添加自己的代码,起到各种各样的附加功能

二、代码
// 调用方 不属于工厂结构内部
public class ProxyPatternMain {
    public static void main(String[] args) {
        Girl girl = new Girl("女孩纸");
        TheReal theReal = new TheReal("单身狗", girl);
        TheProxy theProxy = new TheProxy(theReal);
        // 这个girl是在TheReal还是在TheProxy中视功能而定,甚至完全可以不需要
        theProxy.sentChocolate();
        theProxy.sentFlower();
        theProxy.sentSnacks();
    }
}


// ISentGift的接口
public interface ISentGift {
    void sentFlower();
    void sentChocolate();
    void sentSnacks();
}

// 代理类
public class TheProxy implements  ISentGift{
    TheReal theReal;
    public TheProxy(TheReal theReal) {
        this.theReal = theReal;
    }
    @Override
    public void sentFlower() {
    	//可以拓展
        this.theReal.sentFlower();
        //可以拓展
    }
    @Override
    public void sentChocolate() {
        //可以拓展
        this.theReal.sentChocolate();
    	//可以拓展
    }
    @Override
    public void sentSnacks() {
        //可以拓展
        this.theReal.sentSnacks();
        //可以拓展
    }
}

// 实际执行类
public class TheReal implements ISentGift {
    String name;
    Girl girl;
    public TheReal(String name, Girl girl) {
        this.name = name;
        this.girl = girl;
    }
    @Override
    public void sentFlower() {
        System.out.println(this.name+ "送花给" +this.girl.name);
    }
    @Override
    public void sentChocolate() {
        System.out.println(this.name+ "送巧克力给" +this.girl.name);
    }
    @Override
    public void sentSnacks() {
        System.out.println(this.name+ "送零食给" +this.girl.name);
    }
}


// 女孩类
public class Girl {
    String name;
    public Girl(String name) {
        this.name = name;
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值