Go和Java实现代理模式

Go和Java实现代理模式

下面通过一个用户登录的例子来说明代理模式的使用。

1、代理模式

在代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

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

  • 意图:为其他对象提供一种代理以控制对这个对象的访问。

  • 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些

    对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访

    问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

  • 何时使用:想在访问一个类时做一些控制。

  • 如何解决:增加中间层。

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

  • 应用实例:1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠

    兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟

    空,所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行

    存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring

    aop。

  • 优点:1、职责清晰。 2、高扩展性。 3、智能化。

  • 缺点:1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速

    度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

  • 使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。

    4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化

    (Synchronization)代理。 8、智能引用(Smart Reference)代理。

  • 注意事项:1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类

    的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

  • 适用性:

    远程代理 (RemoteProxy) 为一个对象在不同的地址空间提供局部代表。

    虚代理 (VirtualProxy) 根据需要创建开销很大的对象。

    保护代理 (ProtectionProxy) 控制对原始对象的访问。

    智能指引 (SmartReference) 取代了简单的指针,它在访问对象时执行一些附加操作。

2、Go实现代理模式

package proxy// ========== IUser ==========
type IUser interface {Login(username, password string)
}
package proxyimport "fmt"// ========== User ==========
type User struct {
}func (u *User) Login(username, password string) {fmt.Println("User Login...")fmt.Println("username is " + username + ",password is " + password)
}
package proxyimport "fmt"// ========== UserProxy ==========
type UserProxy struct {user *User
}func NewUserProxy() *UserProxy {fmt.Println("这是代理类!")return &UserProxy{user: &User{},}
}// Login登录,和user实现相同的接口
func (p *UserProxy) Login(username, password string) {fmt.Println("执行代理类的login方法!")p.user.Login(username, password)
}
package mainimport (. "proj/proxy"
)func main() {userProxy := NewUserProxy()userProxy.Login("root", "root")
}
# 输出
这是代理类!
执行代理类的login方法!
User Login...
username is root,password is root

3、Java实现代理模式

package com.proxy;// ========== IUser ==========
public interface IUser {void login(String username, String password);
}
package com.proxy;// ========== User ==========
public class User implements IUser{@Overridepublic void login(String username, String password) {System.out.println("User Login...");System.out.println("username is " + username + ",password is "+password);}
}
package com.proxy;// ========== UserProxy ==========
public class UserProxy implements IUser {private IUser iuser;public UserProxy() {System.out.println("这是代理类!");iuser = new User();}@Overridepublic void login(String username, String password) {System.out.println("执行代理类的login方法!");iuser.login(username, password);}
}
package com.proxy;public class Test {public static void main(String[] args) {IUser iUser = new UserProxy();iUser.login("root","root");}
}
# 输出
这是代理类!
执行代理类的login方法!
User Login...
username is root,password is root

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

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

相关文章

MySQL数据库 入门

目录 一、MySQL概述 二、MySQL安装 安装数据库 配置数据库 启动停止数据库 客户端连接数据库 三、数据模型 四、SQL 一、MySQL概述 先来讲解三个概念:数据库、数据库管理系统、 SQL 。 而目前主流的关系型数据库管理系统的市场占有率排名如下: …

【从零开始学习--设计模式--代理模式】

返回首页 前言 感谢各位同学的关注与支持,我会一直更新此专题,竭尽所能整理出更为详细的内容分享给大家,但碍于时间及精力有限,代码分享较少,后续会把所有代码示例整理到github,敬请期待。 此章节介绍建…

(第38天)RAC 修改 IP 信息

介绍 在生产中有时候会遇到机房搬迁网络变更、系统上线由测试环境切换为生产环境、系统层面双网卡绑定或者解绑等情况。Oracle RAC 环境下应该如何操作?首先,我们都知道 Oracle RAC 中的 IP 主要有:Public IP、Virtual IP、SCAN IP、Private IP 这几种,接下来分别讲解这几…

C语言算法与数据结构,旅游景区地图求最短路径

背景: 本次作业要求完成一个编程项目。请虚构一张旅游景区地图,景区地图包括景点(结点)和道路(边):地图上用字母标注出一些点,表示景点(比如,以点 A、B、C、…

【matlab】

MATLAB 中的标量运算及实例 引言 在 MATLAB 中,标量是指只包含单个数值的变量或常量。尽管标量运算可能看似简单,但它在数值计算、数据处理和算法设计中扮演着重要的角色。本文将深入探讨 MATLAB 中的标量运算,介绍其基本操作和一些实例应用…

vue2使用wangeditor实现数学公式+富文本编辑器

需求: 做一个带有数学公式的富文本编辑器,在网上看了很多,这个最合适,借鉴了wangEditor富文本编辑器 这里面写的是v3的整合富文本编辑器,我照着上面改成了v2的,本文章主要是实现步骤和错误解决,…

【数据结构】单链表的定义和操作

目录 1.单链表的定义 2.单链表的创建和初始化 3.单链表的插入节点操作 4.单链表的删除节点操作 5.单链表的查找节点操作 6.单链表的更新节点操作 7.完整代码 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助…

2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和的最大值。 来自字节。

2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和的最大值。 来自字节。 答案2023-12-16: 来自左程云。 灵捷3.5 大体步骤如下: 算法 maxSum1 分析&#xff1…

网络时间服务器

本章主要介绍网络时间服务器。 使用chrony配置时间服务器 配置chrony客户端向服务器同步时间 1 时间同步的必要性 一些服务对时间要求非常严格,例如,图所示的由三台服务器搭建的ceph集群。 这三台服务器的时间必须保持一致,如果不一致&#…

杰卡德的故事

三个男人分别是杰卡德距离 杰卡德相似系数和杰卡德系数 杰卡德相似系数和杰卡德距离是互为相反数的。 杰卡德系数和杰卡德距离是不是一回事 感觉是一回事

DevOps搭建(二)-阿里云镜像仓库的使用详解

博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…

NVIDIA A100 PCIE 40GB k8s-device-plugin install in kubernetes

文章目录 1. 目标2. 简介2.1 英伟达 A100 技术规格2.2 架构优势2.3 显卡跑分对比2.4 英伟达 A100 与 kubernetes 3. 安装 NVIDIA A100 GPU 40G 硬件4. NVIDIA R450 datacenter driver5. NVIDIA Container Toolkit6. 创建 runtimeclass5. MIG Strategies6. 配置仓库7. 下载镜像8…

Spring cloud - 断路器 Resilience4J

其实文章的标题应该叫 Resilience4J,而不是Spring Cloud Resilience4J,不过由于正在对Spring cloud的一系列组件进行学习,为了统一,就这样吧。 概念区分 首先区分几个概念 Spring cloud 断路器:Spring Cloud的官网对…

【Django-03】模型常用的增删改查

Django Model 增删改查函数 QuerySet 对象all()filter()get()exclude()values()distinct()支持的表达式组合使用创建数据更新数据删除数据F()函数Q()函数 class Grade(models.Model):id models.AutoField(verbose_name自增id, name"id", primary_keyTrue)grade_name…

02_Web开发基础之JavaScript

Web开发基础之JavaScript 学习目标和内容 1、能够描述Javascript的作用 2、能够使用分支结构if语句逻辑判断 3、能够使用其中一种循环语句 4、能够定义javaScript中的函数 5、能够定义javaScript中的对象 6、能够描述DOM的作用 7、能够通过DOM操作HTML标签元素及其属性 8、能够…

1.2 【应用开发】开发一个基本的Screen应用

一,Screen应用开发简述 QNX Screen图形子系统是一个图形框架,因此,使用该框架开发的应用程序在复杂性和功能上可能会有很大差异。也就是说,大多数Screen应用程序在简化后,会执行某种渲染,以便在显示器上显…

走进暄桐教室 一起观看暄桐同学作品及感受

暄桐是一间传统美学教育教室,创办于2011年,林曦是创办人和授课老师,教授以书法为主的传统文化和技艺,旨在以书法为起点,亲近中国传统之美,以实践和所得,滋养当下生活。其实,暄桐教室…

vue表单输入绑定

基础用法 你可以用 v-model 指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇&#xff0c;但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据&#xff0…

大O记法了解

1、概念 大O记法&#xff08;Big O notation&#xff09;是一种用于描述算法时间复杂度的一种标记法。它表示了算法在最坏情况下对输入规模的增长速度&#xff0c;或者说算法执行时间的增长速度。用大写字母O和一个函数来表示&#xff0c;定义为T(n)O(f(n))。其中&#xff0c;…

数据结构与算法—查找算法(线性查找、二分查找、插值查找、斐波那契查找)

查找算法 文章目录 查找算法1. 线性查找算法2. 二分查找算法2.1 二分查找思路分析2.2 应用实例 3. 插值查找3.1 基本原理3.2 应用实例 4. 斐波那契4.1 基本原理4.2 应用实例 5. 查找总结 在java中&#xff0c;常用的查找有四种&#xff1a; 顺序(线性)查找二分查找/折半查找插值…