代理模式

设计模式——代理模式(静态)

戏子无情 提交于 2020-03-03 00:18:35
定义: 为其他的对象提供一种代理,以控制对这个对象的访问。 大白话就是,对象不想展示给客户端,或者不方便展示给客户端,那就通过一个类来间接的调用这个类。 代理类和实体类共同实现一个接口,代理类中保存一个对实体类的引用,提供一个实体类一样的接口,这样,代理类就可以替换实体类了。 结构: subject:代理类和实体类共同的接口, Proxy:实现subject接口,并且保存了对实体类的引用,也可以增加一些功能。 lrealSubject:实现subject接口,Proxy所代表的实体。 UML图: eg: 生活中,我们代理的模式特别多,例如:我们经常找中介租房,亦或者是找铁哥们帮助自己送个东西给心爱的女生什么的。 中介租房: Host: //租房接口 public interface Host { public void rent(); } HostWomen: //房东实体 public class HostWoman implements Host { @Override public void rent() { System.out.println("房东租房"); } } Proxy: public class Proxy implements Host { HostWoman hw = new HostWoman(); @Override public void rent(

使用SpringBoot开发群聊应用

旧时模样 提交于 2020-03-02 18:51:53
通过本文你将学习如何使用Spring Boot和WebSocket API开发一个简单的群聊天应用。 WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 很多网站为实现推送技术,所用技术都是Ajax轮询。轮询指的是在特定的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后服务器返回最新的数据给浏览器。这种传统的模式有很明显的缺点,即浏览器需要不断的向服务器发出请求,而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,这样就会浪费很多资源。HTML5定义的WebSocket协议能更好的节省服务器带宽等资源,并能够实时地进行你通讯。 详情请看 HTML5 WebSocket 。 新建项目 打开IDEA,选择 Spring Initializer 填写好相关信息: 依赖选择 Spring Web 和 WebSocket 之后选择 Finish 即可。创建完毕后,项目目录结构如下: WebSocket配置 首先我们配置一下WebSocket端点和消息代理。在 com.andy.chat 包下创建一个名为

什么是代理模式?代理模式模块总结

筅森魡賤 提交于 2020-03-02 10:51:46
大家好,这是一个为了梦想而保持学习的博客。这是第一篇文章,分享一下我对【代理模式】的理解​。 文章的风格会一直保持问答的方式讲述,这是我个人喜欢的一种风格,也是相当于模拟面试​。​ 什么是代理? 让我们假设一个场景,一家法国的酒厂想要在中国大陆卖酒,拓展新业务。但是酒厂只想提供酒,其他的销售啊,发货啊这些事情他们并不想做,于是就在中国找了个代理。代理就负责去做原本酒厂不想做的那些事情,而酒厂就只需要提供酒就可以了,这就完成了一次 业务扩展 ,这也就是代理存在的意义。 设计源于生活,基于以上场景,我们就可以知道代理模式的应用场景,与代理模式的工作模块。 应用场景:用于对 原生函数 ——卖酒,的增加与扩展。 工作模块:分为 被代 理对象 ——酒厂,与 代理对象 ——中国的代理机构。 Java中的代理分为几种? 可以分为 静态代理 与 动态代理 两种。 静态代理主要是在编写代码时由我们 手动编写代理类 去实现拓展的功能,之所以称之为静态,是因为所有的代理关系全部都是固定死的。就像上面的场景中,A酒厂创建了一个代理部门,只去代理A酒厂的业务,称之为A代理,他们的关系是1对1固定的。 动态代理相对于静态代理,最大的变化就是 不用手动去实现自己的代理类了 ,只需要通过JDK或者CGLIB去获得一个代理类,而代理类是在运行时被生成与加载的。回到上面的场景,动态代理就相当于A找了一个代理机构

代理模式&动态代理

折月煮酒 提交于 2020-03-02 08:20:10
动态代理的用途: 动态代理的用途与装饰模式很相似,就是为了对某个对象进行增强。所有使用装饰者模式的案例都可以使用动态代理来替换,动态代理可以更好的解耦合 增强有3个手段 1. 继承 被增强对象不能变 增强内容不能变 2. 装饰者模式 被增强对象可变 但增强内容不能变 3. 动态代理 被增强对象可变 增强内容也可变 如何实现动态代理? 定义一个接口Interface, 被增强的对象的类都会实现这个接口 public interface Interface { public void fun(); } 实现这个Interface接口: 而这个InterfaceImpl就是动态代理中被增强的内容 public class InterfaceImpl implements Interface { @Override public void fun() { System.out.println("目标方法调用"); } } 定义一个接口Advice, 增强内容的类都会实现这个接口 这个接口有两个未实现的方法: before()前置增强的方法 after()后置增强的方法 public interface Advice { public void before(); public void after(); } 而实现了Advice接口的对象就是动态代理中增强内容 JavaAPI: java

6.5 代理

你离开我真会死。 提交于 2020-03-02 05:14:51
6.5 代理   利用代理可以在运行时创建一个实现了一组给定接口的新类,这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。   结社有一个表示接口的Class对象(有可能只包含一个接口),它的确切类型在编译时无法知道。要想构造一个实现这些接口的类,就需要使用newInstance方法或反射找出这个类的构造器。但是不能实例化一个接口,需要在程序处于运行状态时定义一个新类。    常规但比较笨重的解决方式: 程序生成代码,将代码放置在一个文件中,调用编译器,然后再加载结果类文件。这样的速度比较慢,并且需要将编译器与程序放在一起。    代理机制的解决方式: 代理类在运行时创建全新的类,这样的代理类就能够实现指定的接口。尤其是,它具有下列方法: 指定接口所需要的全部方法; Object类中的全部方法,例如,toString、equals等。   不能在运行的时候定义这些方法的新代码,而需要提供一个调用处理器(invocation handler)。调用处理器是实现了InvocationHandler接口的类的对象,这个接口中只有一个方法:    Object invoke(Object proxy, Method method, Object[] args)   无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原理的调用参数

Java动态代理与CGLIB

北城余情 提交于 2020-03-02 03:07:09
1. 静态代理模式 因为需要对一些函数进行二次处理,或是某些函数不让外界知道时,可以使用代理模式,通过访问第三方,间接访问原函数的方式,达到以上目的,来看一下代理模式的类图: interface Hosee{ String sayhi(); } class Hoseeimpl implements Hosee{ @Override public String sayhi() { return "Welcome oschina hosee's blog"; } } class HoseeProxy implements Hosee{ Hosee h; public HoseeProxy(Hosee h) { this.h = h; } @Override public String sayhi() { System.out.println("I'm proxy!"); return h.sayhi(); } } public class StaticProxy { public static void main(String[] args) { Hoseeimpl h = new Hoseeimpl(); HoseeProxy hp = new HoseeProxy(h); System.out.println(hp.sayhi()); } } 1.1 静态代理的弊端

Qt model/view理解2:添加代理-20151018更新理解

帅比萌擦擦* 提交于 2020-03-02 02:45:25
这是我对Qt的model/view内容理解的第二篇blog,在第一篇文章中,介绍QTableView和QAbstractTableModel,实现显示了对数据源的显示,但是显示的格式和修改的模式都是按照View控件的自显示方式。在此,使用Qt自带的QStyledItemDelegate类实现对特定行/列的显示/修改模式实现,实现过程中不出现对item的代码生成,对item的生成由程序自动完成。 在此同样以《c++ gui programming with Qt4》中的trackEditor例子作一讲解。 在此,我们首先应当考虑以下几个问题: 1)有一个代理类加到View中,处理特定的View内容。 2)代理类要完成以下几项工作:a)当用户修改数据时生成用户要求的控件(用户每次修改数据时在相应的位置都会生成控件,所以当控件用完后,应del释放资源)。b)设置在生成的修改控件中显示的内容。c)设置要写到model中的数据内容。d)设置当结束修改数据后,View显示的内容。 在此我们需要实现以下4个类。 /** @brief 保存显示数据的类。 */ class Track /** @brief 继承的委托类。 */ class TrackDelegate : public QStyledItemDelegate /** @brief 继承的模型类。 */ class

ssh利用端口转发实现SOCKS5代理

ε祈祈猫儿з 提交于 2020-02-29 19:39:43
现在linux下ssh使用比较广泛的是openssh包 ###ssh相关选项:### -V 显示版本: ssh -V OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 Jan 2014 -f 输入密码后进入后台模式(Requests ssh to go to background just before command execution.) -N 不执行远程命令,用于端口转发( Do not execute a remote command. This is useful for just for warding ports (protocol version 2 only).) -D socket5代理(Specifies a local “dynamic” application-level port forwarding.Currently the SOCKS4 and SOCKS5 protocols are supported, and ssh will act as a SOCKS server.) -L tcp转发(Specifies that the given port on the local (client) host is to be forwarded to the given host and port

requests.get()参数

北战南征 提交于 2020-02-29 16:41:45
查询参数-params 1.参数类型   字典,字典中键值对作为查询参数 2.使用方法 1、res = requests.get(url,params=params,headers=headers) 2、特点: * url为基准的url地址,不包含查询参数 * 该方法会自动对params字典编码,然后和url拼接 3.示例 import requests baseurl = 'http://tieba.baidu.com/f?' params = { 'kw' : '赵丽颖吧', 'pn' : '50' } headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'} # 自动对params进行编码,然后自动和url进行拼接,去发请求 res = requests.get(baseurl,params=params,headers=headers) res.encoding = 'utf-8' print(res.text)

java反射与代理

馋奶兔 提交于 2020-02-29 07:52:21
Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC、AOP就是通过反射机制与动态代理实现的。 1 Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod(),或者遍历修改可访问性 Method method = cls.getMethod("getTime5Flag"); String res1 = (String) method.invoke(user); System.out.println(res1); //涉及到基本类型如int,则使用int.class!Integer.class!=int.class! method = cls.getMethod("setTime5Flag", String.class); method.invoke(user, "Rollen"); method = cls.getMethod("getTime5Flag"); String res2 = (String) method.invoke(user); System.out.println(res2);