当前位置: 首页 > news >正文

Java Proxy Pattern(代理模式)

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

关键代码:实现与被代理类组合。

优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

  1. 创建一个接口。
/**
 * 1. 创建一个接口
 * @author mazaiting
 */
public interface Image {
    /**
     * 显示
     */
    void display();
}
  1. 创建实现接口的实体类。
/**
 * 2. 创建实现接口的实体类。
 * @author mazaiting
 */
public class RealImage implements Image{

    private String fileName;

    public RealImage(String fileName) {
        this.fileName = fileName;
        loadFromDisk(fileName);
    }
    
    private void loadFromDisk(String filename) {
        System.out.println("Loading " + filename);
    }

    public void display() {
        System.out.println("Displaying " + fileName);
    }

}


/**
 * 2. 创建实现接口的实体类。
 * @author mazaiting
 */
public class ProxyImage implements Image{

    private RealImage realImage;
    private String fileName;
    
    public ProxyImage(String fileName){
        this.fileName = fileName;
    }
    
    public void display() {
        if (null == realImage){
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }

}
  1. 当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。
public class Client {
    public static void main(String[] args) {
        Image image = new ProxyImage("test.jpg");

        // 图像将从磁盘加载
        image.display();
        System.out.println("");
        // 图像将无法从磁盘加载
        image.display();

    }
}
  1. 打印结果
Loading test.jpg
Displaying test.jpg

Displaying test.jpg

相关文章:

  • BZOJ1015 星球大战starwar
  • 教你找回 git stash 数据中的数据
  • 驱动移植过程中DMA内存相关接口替换
  • HBase二级索引实现方案
  • 前向星和链式前向星
  • 开源PaaS Rainbond v3.7.0-rc1版本更新,系统生产稳定性大幅提升
  • zabbix3.0.4监控linux主机cpu使用率超过90%的时候报警
  • corosync + pacemaker +mysql +nfs
  • Java+大数据开发——Hadoop集群环境搭建(二)
  • python 循环列表的同时做删除操作
  • Mysql中数据类型括号中的数字代表的含义
  • python 正则匹配字母数字中的任意数字,字母
  • 大保健就是做公益?马云的一招让这个特殊群体赞不绝口
  • 儿童做家务年龄对照表,80%的父母都后悔看晚了…
  • Windows Embedded Standard CTP发布!
  • [译] 怎样写一个基础的编译器
  • 4. 路由到控制器 - Laravel从零开始教程
  • canvas 绘制双线技巧
  • create-react-app项目添加less配置
  • eclipse(luna)创建web工程
  • interface和setter,getter
  • JavaScript函数式编程(一)
  • JS函数式编程 数组部分风格 ES6版
  • linux学习笔记
  • text-decoration与color属性
  • vue2.0项目引入element-ui
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 百度地图API标注+时间轴组件
  • 程序员最讨厌的9句话,你可有补充?
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 多线程事务回滚
  • 简单基于spring的redis配置(单机和集群模式)
  • 码农张的Bug人生 - 见面之礼
  • 突破自己的技术思维
  • 学习JavaScript数据结构与算法 — 树
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)IOS中获取各种文件的目录路径的方法
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .Family_物联网
  • .NET Core中Emit的使用
  • .NET框架类在ASP.NET中的使用(2) ——QA