设计模式:代理模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

news2024/12/24 10:28:03

简介:

代理模式,它是一种结构型设计模式,它通过引入一个代理对象来控制对原始对象的访问。代理模式的主要目的是在保持原始对象完整性的同时,提供对原始对象的访问和控制。

代理模式包括以下三个角色:

抽象主题类(Subject):通过接口或抽象类声明真实主题和代理对象实现的业务方法。
真实主题类(Real Subject):实现抽象主题中的具体业务,是代理对象所代表的真实对象,是最终引用的对象。
代理类(Proxy):提供与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
在代理模式中,代理对象充当访问对象和目标对象之间的媒介,通过代理对象实现对目标对象的访问。被代理的对象可以是远程对象、创建开销大的对象以及需要安全控制的对象。

代理模式可以按照代理的生成时机不同分为静态代理和动态代理。静态代理在编译期就生成代理对象,而动态代理则是在Java运行时动态生成。动态代理又分为JDK动态代理和Cglib动态代理两种。

使用代理模式可以带来很多好处,例如可以控制对原始对象的访问,可以在调用真实对象之前或之后执行一些操作,可以扩展真实对象的功能,可以提供更复杂的接口等。

总之,代理模式是一种非常有用的设计模式,可以帮助我们更好地设计和实现软件系统。

代理模式的使用场景:
1、保护目标对象:客户端只与代理类进行交互,不清楚目标对象的具体细节。这可以保护目标对象不被直接访问,增强了安全性。
2、增强目标对象:代理类可以在目标对象的基础上,对目标对象的功能进行增强。代理对象可以扩展目标对象的功能,实现额外的操作。
3、分离目标对象:代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性。这种分离使得客户端和目标对象的交互更加清晰和灵活。

以上场景中,代理模式通过在客户端和目标对象之间增加一个代理对象,实现对目标对象的访问和控制。代理对象可以提供与目标对象相同的接口,并且内部含有对目标对象的引用,通过代理对象实现对目标对象的访问和控制。

代理模式的创建步骤:
1、定义一个接口,该接口定义了目标对象的所有方法。
2、创建目标对象,实现接口中定义的所有方法。
3、创建代理对象,该对象需要实现与目标对象相同的接口,并在内部持有对目标对象的引用。
4、在代理对象中,重写目标对象的所有方法,并在调用目标对象之前或之后执行一些操作。
5、在客户端代码中,使用代理对象代替目标对象进行操作。

以上步骤是代理模式的基本创建过程,具体实现方式可能会因语言和框架的不同而有所差异。在实际开发中,可以根据具体情况进行调整和优化。

代理模式的优点,主要包括:
1、职责清晰:真实的角色实现实现的业务逻辑,不用关心其他非本职的事务,通过后期的代理完成附件的事务,附带的结果就是编程简洁清晰。
2、高度扩展性:具体主题角色随需求不同可能变为多种,但是只要实现了接口,代理类就可以完全在不做任何修饰的情况下代理各种真实的角色。
3、智能化:代理类可以再运行的时候确定真实的代理主题,这是一种强大的功能。
4、保护目标对象:代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。同时,代理对象可以在调用真实对象之前或之后执行一些操作,增强了程序的灵活性和可扩展性。

代理模式的缺点,主要包括:
1、代理对象可能会造成请求的处理速度变慢。由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作。有些代理模式的实现非常复杂,需要编写更多的代码和测试用例来确保代理对象和真实对象之间的通信和交互是正确的。
3、代理对象可能会对真实对象进行过度的控制,使得真实对象无法被正确地使用。
4、在代理模式中,客户端需要知道代理对象的类型和接口,这可能会破坏封装性,使得代码变得不够灵活。

总之,虽然代理模式具有许多优点,但是也有一些缺点需要注意。在使用代理模式时,需要根据具体的应用场景和需求来权衡利弊,并选择合适的代理模式来实现所需的功能。

示例:


一、C#代理模式

以下是一个示例,展示了如何在C#中实现代理模式:

public interface ISubject {  
    void DoSomething();  
}  
  
public class RealSubject : ISubject {  
    public void DoSomething() {  
        Console.WriteLine("RealSubject.DoSomething()");  
    }  
}  
  
public class Proxy : ISubject {  
    private ISubject _subject;  
  
    public Proxy(ISubject subject) {  
        _subject = subject;  
    }  
  
    public void DoSomething() {  
        Console.WriteLine("Proxy.DoSomething()");  
        _subject.DoSomething();  
    }  
}  
  
class Program {  
    static void Main(string[] args) {  
        ISubject subject = new RealSubject();  
        Proxy proxy = new Proxy(subject);  
        proxy.DoSomething(); // Output: Proxy.DoSomething() RealSubject.DoSomething()  
    }  
}

二、java代理模式

代理模式通常通过以下方式实现:

interface Subject {  
    void doSomething();  
}  
  
class RealSubject implements Subject {  
    public void doSomething() {  
        System.out.println("RealSubject.doSomething()");  
    }  
}  
  
class Proxy implements Subject {  
    private Subject _subject;  
  
    public Proxy(Subject subject) {  
        _subject = subject;  
    }  
  
    public void doSomething() {  
        System.out.println("Proxy.doSomething()");  
        _subject.doSomething();  
    }  
}  
  
public class ProxyPatternDemo {  
    public static void main(String[] args) {  
        Subject subject = new RealSubject();  
        Proxy proxy = new Proxy(subject);  
        proxy.doSomething(); // Output: Proxy.doSomething() RealSubject.doSomething()  
    }  
}

三、javascript代理模式

在JavaScript中,代理模式的实现方式如下:

class Subject {  
  constructor() {  
    this._data = [];  
  }  
  
  addData(data) {  
    this._data.push(data);  
  }  
  
  getData() {  
    return this._data;  
  }  
}  
  
class Proxy {  
  constructor(subject) {  
    this._subject = subject;  
  }  
  
  addData(data) {  
    console.log('Proxy.addData()');  
    this._subject.addData(data);  
  }  
  
  getData() {  
    console.log('Proxy.getData()');  
    return this._subject.getData();  
  }  
}  
  
const subject = new Subject();  
const proxy = new Proxy(subject);  
proxy.addData('data1'); // Output: Proxy.addData() [ 'data1' ]  
proxy.getData(); // Output: Proxy.getData() [ 'data1' ]

四、C++代理模式

以下是在C++中实现代理模式:

class Subject {  
public:  
    virtual void doSomething() = 0;  
};  
  
class RealSubject : public Subject {  
public:  
    void doSomething() override {  
        std::cout << "RealSubject.doSomething()" << std::endl;  
    }  
};  
  
class Proxy : public Subject {  
public:  
    Proxy(Subject* subject) : _subject(subject) {}  
    void doSomething() override {  
        std::cout << "Proxy.doSomething()" << std::endl;  
        _subject->doSomething();  
    }  
private:  
    Subject* _subject;  
};  
  
int main() {  
    RealSubject* realSubject = new RealSubject();  
    Proxy* proxy = new Proxy(realSubject);  
    ((Subject*)proxy)->doSomething(); // Output: Proxy.doSomething() RealSubject.doSomething()  
    delete proxy;  
    delete realSubject;  
    return 0;  
}

五、python代理模式

以下是在python中实现代理模式:

class Subject:  
    def do_something(self):  
        pass  
  
class RealSubject(Subject):  
    def do_something(self):  
        print("RealSubject.do_something()")  
  
class Proxy(Subject):  
    def __init__(self, real_subject):  
        self._real_subject = real_subject  
      
    def do_something(self):  
        print("Proxy.do_something()")  
        self._real_subject.do_something()  
  
if __name__ == "__main__":  
    real_subject = RealSubject()  
    proxy = Proxy(real_subject)  
    proxy.do_something() # Output: Proxy.do_something() RealSubject.do_something()
    

六、go代理模式

以下是一个示例,展示了如何在go中实现代理模式:

type RealObject struct{}  
  
func (r *RealObject) Operation() {  
    fmt.Println("RealObject.Operation()")  
}  
  
type ProxyObject struct {  
    realObj *RealObject  
}  
  
func (p *ProxyObject) Operation() {  
    fmt.Println("ProxyObject.Operation()")  
    p.realObj.Operation()  
}  
  
func main() {  
    realObj := &RealObject{}  
    proxyObj := &ProxyObject{realObj: realObj}  
    proxyObj.Operation() // Output: ProxyObject.Operation() RealObject.Operation()  
}

七、PHP代理模式

以下是一个示例,展示了如何在PHP中实现代理模式:

<?php  
  
// 目标接口  
interface Subject {  
    public function doSomething();  
}  
  
// 目标类  
class RealSubject implements Subject {  
    public function doSomething() {  
        echo "RealSubject.doSomething()";  
    }  
}  
  
// 代理类  
class Proxy implements Subject {  
    private $realSubject;  
      
    public function __construct(RealSubject $realSubject) {  
        $this->realSubject = $realSubject;  
    }  
      
    public function doSomething() {  
        echo "Proxy.doSomething()";  
        $this->realSubject->doSomething();  
    }  
}  
  
// 客户端代码  
$realSubject = new RealSubject();  
$proxy = new Proxy($realSubject);  
$proxy->doSomething(); // Output: Proxy.doSomething() RealSubject.doSomething()


《完结》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1120312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EtherCAT主站SDO写报文抓包分析

0 工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1 抓包分析 1.1 报文总览 本文设置从站1的对象字典&#xff0c;设置对象字典主索引为0x2000&#xff0c;子索引为0x00&#xff0c;设置值为1500。主站通过发送SDO写报文…

Linux tmux使用总结

文章目录 1 tmux介绍2 tmux概念会话Sessions、窗口Windows、面板Panesstatus line中字段含义 3 Sessions会话管理新建会话断开当前会话进入之前的会话关闭会话查看所有的会话 4 tmux快捷指令系统指令窗口&#xff08;Windows&#xff09;指令面板&#xff08;Panes&#xff09;…

cec2013(python):麻雀搜索算法SSA求解CEC2013(提供完整python代码及参考文献)

一、麻雀搜索算法SSA求解cec2013 cec2013函数简介 CEC 2013 Special Session on Real-Parameter Optimization中共有28个测试函数维度可选择为10/30/50/100。 每个测试函数的详细信息如下表所示&#xff1a; 参考文献&#xff1a;[1] Liang J J , Qu B Y , Suganthan P N , …

Go并发编程之三

一、前言 前一篇讲了Go中通道的概念&#xff0c;只讲了无缓存通道&#xff0c;这一篇我们来了解一下有缓存通道以及它与无缓存通道一些区别。 二、有缓存通道 无缓存通道&#xff1a;如果通道数据没有被接收&#xff0c;发送方会被阻塞&#xff0c;相当于同步。 有缓存通道&…

Python图像处理【14】基于非线性滤波器的图像去噪

基于非线性滤波器的图像去噪 0. 前言1. min 滤波器2. max 滤波器3. mode 滤波器4. 高斯、中值、mode 和 max 滤波器对比小结系列链接 0. 前言 本节中我们将介绍诸如 max 和 min 之类的非线性滤波器&#xff0c;与中值滤波器一样&#xff0c;它们根据滑动窗口中像素的顺序统计信…

css中px、em、rem、%、vw、vh、vm、rpx 这些单位的区别

序言 px&#xff1a;像素 相对长度单位&#xff0c;相对于显示器屏幕分辨率(推荐使用) em&#xff1a;相对长度单位 基准点为父节点字体的大小&#xff0c;如果自身定义了font-size按自身来计算&#xff08;浏览器默认字体是16px&#xff09;&#xff0c;整个页面内1em不是一个…

10个最流行的土木工程BIM软件

建筑信息模型 (BIM) 是一种数字化流程&#xff0c;最近在土木工程领域受到广泛关注。 它是一种设计、构建和管理项目的协作方法。 它涉及创建和使用建筑物的详细数字表示&#xff0c;包括 3D 模型、数据和有关项目的信息。 BIM 在参与项目的不同利益相关者之间提供实时协作&…

【Docker从入门到入土 2】Docker数据管理、网络通信和网络模式 1.0

Part2 一、Docker网络模式&#xff08;面试高频&#xff09;1.1 Docker 网络实现原理1.2 host模式1.3 container模式1.4 none模式1.5 bridge模式1.6 自定义网络 二、Docker网络通信2.1 端口映射2.2 容器互联 三、Docker资源控制3.1 Cgroup简介3.2 CPU资源控制3.2.1 设置CPU使用…

JAVA高级教程-Java Map(6)

目录 6、Map的使用 6、Map的使用 package Map01;import java.util.HashMap; import java.util.Map; import java.util.Set;/*** Map接口的使用*/ public class Demo01_HashMap {public static void main(String[] args) {Map<String,String> mapnew HashMap<>();ma…

黔院长 | 不忘初心在逆境中前行!

随着我国经济不断发展进步&#xff0c;以及人口老龄化程度的加深&#xff0c;加上自然环境质量的下降&#xff0c;人们越来越关注和重视自己的健康问题。据世界卫生组织相关数据显示&#xff0c;目前我国的亚健康率已经高达95%&#xff01;健康发展刻不容缓&#xff01; 国家政…

strlen函数

文章目录 strlen函数模拟实现&#xff1a; strlen函数 strlen函数是用来计算字符串长度的&#xff0c;不包括‘\0’ 使用&#xff1a; #include<stdio.h> #include<string.h>int main() {char arr[] "abcdef";int len strlen(arr);printf("%d\n…

Java基础(第一期):IDEA的下载和安装(步骤图) 项目结构的介绍 项目、模块、类的创建。第一个代码的实现

文章目录 IDEA1.1 IDEA概述1.2 IDEA的下载和安装1.2.1 下载1.2.2 安装 1.3 IDEA中层级结构介绍1.3.1 结构分类1.3.2 结构介绍project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09; …

vue3 使用 elementUi: ./lib/theme-chalk/index.css is not exported from package

目录 1. 在 vue3 中使用 element-ui2. 如果启动报错&#xff1a;Module not found: Error: Package path ./lib/theme-chalk/index.css is not exported from package 1. 在 vue3 中使用 element-ui 在 vue3 中使用 element-ui&#xff0c;我们的流程一般是这样的&#xff1a;…

17 Transformer 的解码器(Decoders)——我要生成一个又一个单词

Transformer 编码器 编码器在干吗&#xff1a;词向量、图片向量&#xff0c;总而言之&#xff0c;编码器就是让计算机能够更合理地&#xff08;不确定性的&#xff09;认识人类世界客观存在的一些东西 Transformer 解码器 解码器会接收编码器生成的词向量&#xff0c;然后通…

Go并发编程之二

一、前言 前一篇 Go并发编程之一 主要介绍了如何通过go语句启动协程&#xff08;goroutine&#xff09;以及协程调度的不确定性&#xff0c;这一篇我们重点来介绍一下协程中另外一个重要概念channel&#xff0c;记住第一句话&#xff1a; goroutine之间不是通过共享内存来通信…

JUC高并发容器-CopyOnWriteArrayList

CopyOnWriteArrayList JUC高并发容器线程安全的同步容器类什么是高并发容器&#xff1f;CopyOnWriteArrayList JUC高并发容器 线程安全的同步容器类 Java同步容器类通过Synchronized(内置锁)来实现同步的容器&#xff0c;比如Vector、HashTable以及SynchronizedList等容器。线…

react封装一个简单的upload组件(待完善)

目录 react封装一个简单的upload组件component / uploadImg / uploadImg.jsx使用效果 react封装一个简单的upload组件 component / uploadImg / uploadImg.jsx import React, { useState } from react; import { LoadingOutlined, PlusOutlined } from ant-design/icons; imp…

【源码】C/C++运动会计分系统 期末设计源码

文章目录 题目介绍功能源码效果展示带报告&#xff08;内容&#xff09; 题目介绍 使用语言&#xff1a; 两个版本都会发&#xff1a; 版本1&#xff1a;C语言 版本2&#xff1a; C 代码量&#xff1a; 500 题目介绍&#xff1a; 要求&#xff1a;初始化输入&#xff1a;N-参赛…

C++ 中的模型预测路径积分 (MPPI) 控制

一、说明 模型预测路径积分控制&#xff08;MPPI&#xff09;是一种基于采样的模型预测控制算法。是MPC控制模型的延申和拓宽&#xff0c;要了解MPPI需要先理解MPC&#xff0c;参见文章&#xff1a;MPC预测控制概述和C 中的模型库-CSDN博客 二、模型预测路径积分 (MPPI) 控制 模…

【小白专用23.10.22 已验证】windows 11 安装PHP8.2 +Apache2.4

环境说明 windows:windows 11 x64apache: Apache/2.4.43php :php-8.2.11 一.php 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.要下载Thread Safe&#xff0c;否则没有php8apache2_4.dll这个文件&#xff1b;如果使用Apache作为服务器…