世界观热点:【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

2023-04-25 10:42:00     来源:博客园     编辑:bj001    


(资料图片仅供参考)

简介

代理模式(Proxy Pattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式。

访问控制(保护代理)。如果你只希望特定客户端使用服务对象,这里的对象可以是操作系统中非常重要的部分,而客户端则是各种已启动的程序 (包括恶意程序), 此时可使用代理模式。

作用

  1. 为其他对象提供一种代理访问的方式。
  2. 避免直接访问可能带来的问题,通过接口和代理来实现高扩展。

实现步骤

  1. 定义一个基础接口,约定一些方法。
  2. 建立原始类,实现接口方法。
  3. 再建立代理类,也实现基础接口。代理类调用原始类来实现功能。

UML

Java代码

代理接口类

// Image.java 定义一个接口供代理和实际调用来使用public interface Image {  void display();}

功能代理类

// ProxyImage.java 代理类也实现了基础接口public class ProxyImage implements Image {  private RealImage realImage;  private String fileName;  public ProxyImage(String fileName) {    this.fileName = fileName;  }  @Override  public void display() {    System.out.println("ProxyImage::display() " + fileName);    if (realImage == null) {      realImage = new RealImage(fileName);    }    // 代理类调用真实类的方法    realImage.display();  }}

真实功能类

// RealImage.java 真实类也实现基础代理接口public class RealImage implements Image {  private String fileName;  public RealImage(String fileName) {    // 在初始化时执行内部逻辑    this.fileName = fileName;    loadFromDisk(fileName);  }  @Override  public void display() {    System.out.println("RealImage::display() " + fileName);  }  // 这个方法只是内部使用  private void loadFromDisk(String fileName) {    System.out.println("RealImage::loadFromDisk()  " + fileName);  }}

测试调用

/**   * 代理模式就是用一个类来代理另一个类或几个类的功能,以便隔绝外部客户和内部真实类   * 这样真实类和调用方之间有一个代理屏障,保证了安全   * 同时真实的类如果初始化过,就不再初始化,提升了性能   */    // 声明代理类来执行真实类的能力    Image image = new ProxyImage("001.jpg");    // 代理类执行真实类的能力    image.display();    // 再调用一次,不会重复实例化    image.display();

Go代码

代理接口类

// Image.go 定义一个接口供代理和实际调用来使用type Image interface {  Init(fileName string)  Display()}

功能代理类

// ProxyImage.go 代理类也实现了基础接口type ProxyImage struct {  fileName string  // 直接聚合真实类  // realImage RealImage  // 聚合接口  realImage Image}// 设置文件名称func (p *ProxyImage) SetFileName(fileName string) {  p.fileName = fileName}func (p *ProxyImage) Display() {  fmt.Println("ProxyImage::Display() " + p.fileName)  if p.realImage == nil {    p.realImage = &RealImage{}    p.realImage.Init(p.fileName)  }  // 代理类调用真实类的方法  p.realImage.Display()}

真实功能类

// RealImage.go 真实类也实现基础代理接口type RealImage struct {  fileName string}// 在初始化时执行内部逻辑func (r *RealImage) Init(fileName string) {  r.fileName = fileName  r.LoadFromDisk(fileName)}func (r *RealImage) Display() {  fmt.Println("RealImage::Display() " + r.fileName)}// 这个方法只是内部使用func (r *RealImage) LoadFromDisk(fileName string) {  fmt.Println("RealImage::LoadFromDisk()  " + fileName)}

测试调用

func main() {  fmt.Println("test start:")  /**   * 代理模式就是用一个类来代理另一个类或几个类的功能,以便隔绝外部客户和内部真实类   * 这样真实类和调用方之间有一个代理屏障,保证了安全   * 同时真实的类如果初始化过,就不再初始化,提升了性能   */  // 声明代理类来执行真实类的能力  var image = &src.ProxyImage{}  image.SetFileName("001.jpg")  // 代理类执行真实类的能力  image.Display()  // 再调用一次,真实类不会重复实例化  image.Display()}

C代码简版

// simple_proxy.c#include // 代理模式就是用一个类来代理另一个类或几个类的功能,以便隔绝外部客户和内部真实类// 定义接口typedef struct Interface{    void (*method)(struct Interface *interface);} Interface;// 实现接口的具体类typedef struct Concrete{    void (*method)(struct Concrete *interface);} Concrete;void real_method(struct Concrete *interface){    printf("调用真实方法 real_method.\n");}// 代理类,继承接口,聚合具体类实例typedef struct Proxy{    struct Interface *real_subject;} Proxy;// 代理类方法实现,通过聚合的具体类实例来调用具体类的方法void proxy_method(struct Interface *interface){    struct Proxy *p = (struct Proxy *)interface;    p->real_subject->method((struct Interface *)p);}int main(){    // 创建具体类实例    struct Concrete real_subject = {        .method = &real_method,    };    // 创建代理类实例并聚合具体类实例    struct Proxy proxy_instance = {        .real_subject = (struct Interface *)&real_subject,    };    // 将代理类的方法指针指向代理类的方法实现    struct Interface proxy_interface = {        .method = &proxy_method,    };    // 通过代理类的接口调用具体类方法    proxy_interface.method((struct Interface *)&proxy_instance);    return 0;}

更多语言版本

不同语言实现设计模式:https://github.com/microwind/design-pattern

关键词:

相关新闻
相关新闻
v 推荐福彩3D第2023178期晒票 激发我们更加勇敢地追求幸福生活 2023-07-07
v 珠江水运关键指标快速增长 2023-07-07
v 真相 | “经济胁迫”是美国手中杀人的“刀” 2023-07-07
v 微单相机推荐2013_微单相机推荐2013 2023-07-07
v 多样化种植技术模式助甘肃河西区域保障粮食安全_微头条 2023-07-07
v 教育部部署做好2023年中小学暑期安全工作 世界球精选 2023-07-07
v 泽连斯基将访问土耳其会见埃尔多安,克宫:密切关注会谈结果 2023-07-07
v 1至6月四川公路水路交通建设完成投资1445亿元,同比增长27% 2023-07-07
v 蚂蚁基金被罚7368万元,总经理林思思被罚15万元 2023-07-07
v 主城都市区仍是主阵地!重庆市新增1366家“专精特新”企业  2023-07-07
v 好消息!西南地区首个百兆瓦级电网侧独立储能电站正式并网运行 2023-07-07
v 首批确定20所!重庆市全面启动市级清廉学校试点示范建设工作 2023-07-07
v 江苏:无锡开出“百万价码”引育宣传文化人才 2023-07-07
v 点赞!湘江新区高校毕业生就业工作在全国作典型交流 2023-07-07
v 两市主力资金净流出230亿元 非银金融等行业实现净流入 2023-07-07
v 同比增长8% 长安1-6月销量超120万辆 2023-07-07
v 【风口解读】红蜻蜓上半年净利预增超66%,去年同期基数低下滑超19% 2023-07-07
v 因违规参与银行保险机构业务活动等 蚂蚁集团被罚没超37亿元 2023-07-07
v 金融管理部门对蚂蚁集团罚没71.23亿元,要求关停“相互宝”业务 2023-07-07
v 中国中免上半年实现营收358.58亿元 净利润38.64亿元 2023-07-07
v 头条焦点:用心守护群众生命安全——重庆市万州区群众避险转移一线见闻 2023-07-07
v 上汽集团:第二季度整车销量环比增长32.5% 2023-07-07
v 横店东磁预计上半年实现归母净利11.8亿元至12.6亿元 光伏产业盈利同比实现翻番以上增长 2023-07-07
v 证监会同意碳酸锂期货及期权注册 2023-07-07
v 国家卫健委:提升职业健康检查和职业病诊断结论的准确性 2023-07-07
v 昨天天津局地有小冰雹!高温持续至……要凉快了! 2023-07-07
v “心友会”吐“心”生 2023-07-07
v 华为张平安:盘古大模型不写诗 只做事 2023-07-07
v 宁夏第一个公布2023年养老金调整细则,具体有哪些变化呢? 2023-07-07
v 第19届亚运会杭州西湖赛区场馆有哪些 2023-07-07
分享到:
更多

网站运营:财经头条

财经头条 版权所有©1997-2016 未经书面授权禁止复制或建立镜像
京ICP备12018864号-11
联系我们:291 32 36@qq.com

营业执照公示信息