java设计模式--代理模式(一)

C#串口通讯实战:如何用SerialPort类搞定工业传感器数据采集(附完整代码) 本文详细介绍了如何使用C#的SerialPort类实现工业级传感器数据采集,涵盖串口通讯基础配置、数据帧处理、异常恢复机制及性能优化策略。通过实战代码示例,帮助开发者构建稳定可靠的工业数据采集系统,特别适合需要处理高频数据采集和复杂工业环境的场景。 阅读详情

主要讲智能引用代理

代理实现分为静态代理和动态代理。

静态代理

静态代理模式其实很常见,比如买火车票这件小事:黄牛相当于是火车站的代理,我们可以通过黄牛买票,但只能去火车站进行改签和退票。在代码实现中相当于为一个委托对象realSubject提供一个代理对象proxy,通过proxy可以调用realSubject的部分功能,并添加一些额外的业务处理,同时可以屏蔽realSubject中未开放的接口。


1、RealSubject 是委托类,Proxy 是代理类;
2、Subject 是委托类和代理类的接口;
3、request() 是委托类和代理类的共同方法;

示例1:

抽象对象角色

public abstract class AbstractObject {
    //操作
    public abstract void operation();
}

目标对象角色

public class RealObject extends AbstractObject {
    @Override
    public void operation() {
        //一些操作
        System.out.println("一些操作");
    }
}
代理对象角色

public class ProxyObject extends AbstractObject{
    RealObject realObject = new RealObject();  //代理方法实际上是需要实际对象的
    @Override
    public void operation() {
        //调用目标对象之前可以做相关操作
        System.out.println("before");        
        realObject.operation();        
        //调用目标对象之后可以做相关操作
        System.out.println("after");
    }
}
客户端
public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        AbstractObject obj = new ProxyObject();
        obj.operation();
    }

}

从上面的例子可以看出代理对象将客户端的调用委派给目标对象,在调用目标对象的方法之前跟之后都可以执行特定的操作。这个例子实际上是以下要将聚合的方式。

示例2:继承方式和聚合方式的对比

1.代理类继承实际类(委托类)

代理类和委托类的接口:

package proxy;
public interface Moveable {
	void move();
}
委托类:
import java.util.Random;
public class Car implements Moveable {

	@Override
	public void move() {
		//实现开车
		try {
			Thread.sleep(new Random().nextInt(1000));
			System.out.println("汽车行驶中....");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
代理类:

public class Car2 extends Car {

	@Override
	public void move() {
		long starttime = System.currentTimeMillis();
		System.out.println("汽车开始行驶....");
		super.move();
		long endtime = System.currentTimeMillis();
		System.out.println("汽车结束行驶....  汽车行驶时间:" 
				+ (endtime - starttime) + "毫秒!");
	}

	
}
注:代理类继承了委托类,重写了委托类的方法。在重写时,可以直接调用委托类的方法,在之前和之后可以有自己的业务。

2.聚合的方式(代理类实际上是继承的公共来或实现的公共接口)

聚合指在一个类中调用另外一个类

此时的代理类:

public class Car3 implements Moveable {

	public Car3(Car car) {  //也可以像示例1一样new一个car
		super();
		this.car = car;
	}

	private Car car;
	
	@Override
	public void move() {
		long starttime = System.currentTimeMillis();
		System.out.println("汽车开始行驶....");
		car.move();
		long endtime = System.currentTimeMillis();
		System.out.println("汽车结束行驶....  汽车行驶时间:" 
				+ (endtime - starttime) + "毫秒!");
	}

}


小结:聚合比继承更适合,原因见示例3


示例3:

实现类实现公共接口,其他的多个代理也实现这个公共接口。某个代理要调用实现类实例或另外的代理类实例,调用的参数也通过接口实现。这样有极大的扩展性。


公共接口:

public interface Moveable {
	void move();
}
实现类:

public class Car implements Moveable {
	@Override
	public void move() {
		//实现开车
		try {
			Thread.sleep(new Random().nextInt(1000));
			System.out.println("汽车行驶中....");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

代理之间只知道有实现类方法或代理类方法,具体顺序可以改变时,用如下代码可以实现:

代理1:(增加了时间)
public class CarTimeProxy implements Moveable {

	public CarTimeProxy(Moveable m) {
		super();
		this.m = m;
	}

	private Moveable m;
	
	@Override
	public void move() {
		long starttime = System.currentTimeMillis();
		System.out.println("汽车开始行驶....");
		m.move();
		long endtime = System.currentTimeMillis();
		System.out.println("汽车结束行驶....  汽车行驶时间:" 
				+ (endtime - starttime) + "毫秒!");
	}

}
代理2:(增加了日志)

public class CarLogProxy implements Moveable {

	public CarLogProxy(Moveable m) {
		super();
		this.m = m;
	}

	private Moveable m;
	
	@Override
	public void move() {
		System.out.println("日志开始....");
		m.move();
		System.out.println("日志结束....");
	}

}
实验:

public class Client {

	/**
	 * 测试类
	 */
	public static void main(String[] args) {
		Car car = new Car();
		CarLogProxy clp = new CarLogProxy(car);
		CarTimeProxy ctp = new CarTimeProxy(clp);
		ctp.move();
	}

}
//结果
汽车开始行驶....
日志开始....
汽车行驶中....
日志结束....
汽车结束行驶....  汽车行驶时间:362毫秒!
-------------------------------------------------------------------
public class Client {


	/**
	 * 测试类
	 */
	public static void main(String[] args) {
		Car car = new Car();
		CarTimeProxy ctp = new CarTimeProxy(car);
		CarLogProxy clp = new CarLogProxy(ctp);
		clp.move();
	}


}
//结果
日志开始....
汽车开始行驶....
汽车行驶中....
汽车结束行驶....  汽车行驶时间:662毫秒!
日志结束....

小结:示例3的结果表明,聚合的方式灵活


下一篇:动态代理



复分析 阿尔福斯(Ahlfors) 第三版答案 英文 答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案 立即下载

相关推荐

不懂就学之挑战成为WorldQuant Brain顾问的第1天

WorldQuant Brain 是由 WorldQuant 公司开发的一个基于人工智能和机器学习的量化研究平台,旨在帮助量化研究员发现和构建有效的投资策略。WorldQuant 是一家全球领先的量化投资公司,专注于利用数据科学、技术和金融工程开发量化交易策略。

Yanbang1的博客 8381

java简单静态代理(聚合)

定义一个接口 package com.beckham;/* * 定义一个接口 */public interface Move { public void move() ;}  核心的实现类 package com.beckham;/* * 最初的接口实现 */public class Tank implements Move {

beckham 1299

VulnHub--mrrobot

Vulnhub靶场--Mr robot 靶机

记录笔记 1094

通过Java的继承与聚合两种形式实现静态代理

运用场景:当需要调用到某个方法,而又需要在该方法执行之前或之后再执行其他的逻辑时,就可以用到代理的技术。分类:代理分为静态代理和动态代理两种。可以通过两种方式来实现静态代理,一种是继承的方式,另一种是聚合的方式。代码演示:假设汽车有run(行驶)和stop(停止)两个功能,通过一个CarInterface接口来表示package cn.jie.util; public interface Car...

xiejiejian的博客 926

LD分析实战:基于Plink和R的连锁不平衡计算与可视化全流程

本文详细介绍了基于Plink和R的连锁不平衡(LD)分析全流程,包括基因型数据预处理、LD计算参数设置及结果可视化技巧。通过实战案例解析PLINK文件格式转换、r²值计算关键参数,并展示如何使用ggplot2绘制高质量LD热图,帮助研究人员高效完成基因组关联分析。

weixin_29074295的博客 319

[uboot] (第一章)uboot流程——概述

[uboot] uboot流程系列: [project X] tiny210(s5pv210)上电启动流程(BL0-BL2)建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例子了解一下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运行位置,功能。==============================================

ooonebook的博客 1万+

Java设计模式之代理模式(一)

什么是代理?可以理解为其他对象提供一种代理以控制对这个对象的访问。举个例子,生活中的外卖平台,店铺是制作外卖的,然后放到平台上售卖。这里的店铺就是真实角色,为了能够让店铺不用担心销售等问题,从而能够更加专注做外卖,所以店铺的外卖都会放到平台上面。这里平台就是代理。平台代店家出售,而店家只需要做外卖就好了。代理模式和装饰器模式的区别:装饰器模式为了增强目标对象的功能,而代理模式是为了代理或增强目标对象的功能,本质上两者都可以为目标对象添加一些功能。代理模式可以分为静态代理和动态代理。

cxbtdd的博客 886

n8n实战:动态报表生成与企业微信自动化推送

本文详细介绍了如何利用n8n实现动态报表生成与企业微信自动化推送的全流程。通过配置n8n Form触发器、智能报表生成核心逻辑以及企业微信Webhook推送,帮助企业大幅提升数据收集与报表推送效率,实现从数据录入到报表推送的全自动化处理。

weixin_29267307的博客 304

java设计模式之代理模式(一)

本人刚从大学毕业,工作经验不到半年,之前在学校学的算是马马虎虎吧。虽然C、C++、OC、Java都有过学习,不过都是马马虎虎,应付考试,但现在不同了,进入了公司参加了工作,一切都要从需求出发,解决问题,所以我又重新自学一边java,这次学习主要就放在设计模式上,本博客应对的都是**对java知识有过一丁点基础的小白**,在这里我和大家共同学习共同进步吧。 代理模式,之前学习OC语言时常常接触这个设计

吕松霖技术交流point 453

PC网站实现微信扫码登录功能(二)

上篇我们介绍了怎么申请账号以及最后拿到appId和appSecret,如果有不清楚的可以看一下 PC网站实现微信扫码登录功能(一) 下面我就来说一下怎样在PC端怎么实现扫码登录功能。 一、进入官方文档网站 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 其实官网对过程描述的已经非常细致了。并且提供了两种扫码方式。一种是跳转二维码扫描页面,另一种是内嵌式二维码。大家可以

qq_35771266的博客 3万+

LVDS接口总结--(0)LVDS硬件电路接口

xilinx LVDS接口硬件总结

zidan1412的博客 9715

浅析JAVA设计模式之代理模式(一)

1 代理模式简介    代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。    简单地说,代理类具有和被代理类一样的方法,调用者通过调用代理类的方法间接调用了被代理类相同名字的方法,对于调用者来说,它不用察觉自己调用的是代理类的方法,感觉上仍然在调用被代理类的方法。对于被代理类来说,代理类可以在调用其方法前后做其他工作,比如写日志等。    比如张三拨打电话12345678给李四,这...

minidrupal的专栏 1548

国产麒麟V10系统命令大全,100个实用命令助你玩转系统!

国产麒麟V10系统命令大全,100个实用命令助你玩转系统!

网络技术联盟站 1906

JAVA设计模式之【代理模式】一(静态代理)

代理模式 代理模式是对象的结构模式,给一个对象提供一个代理对象,由代理对象控制对原对象的引用。 代理的种类- 远程(Remote)代理: 为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的空间地址可以是在本机器中,也可以是在另一台机器中。- 虚拟代理: 根据需要创建一个资源消耗较大的对象,使得此对象在真正需要时才会被创建。- Copy-on

Emma_Joans的博客 563

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JAVA23种设计模式之代理模式(一)远程代理RMI

代理模式 代理模式会给某个对象提供一个代理对象,并且有代理对象控制原对象的引用。通俗的说,就是给实际对象找个代理人,由他负责对外的的联系,例如现实社会中的代理律师。由于代理模式相对较多,这里会提出几个使用比较多的代理模式作为示例。 代理模式的实例 2.1. 远程代理模式(RMI) 远程代理实际上就是,为一个位于不同的地址空间的对象提供一个本地代理对象。这个不同的地址空间可以是在同一台主机中,也可...

CoderJu的博客 541

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JAVA设计模式(一)代理模式

代理模式:为其他对象提供一种代理以控制的

supersunshine的专栏 586

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java设计模式(一)代理模式学习

Java代理模式学习 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 无代理模式的代码 比如说这里有一个接口Hello publ...

tripleHu的博客 227

java设计模式之代理模式(转自一淫才)

1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。   2,策略模式有什么好处?     在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。   3,代理模式一般涉及到的角色有: 抽象角色:声明真实对象和代理对象的共同接口;  代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作

a79412906的专栏 1032

JAVA的23种设计模式---代理模式(一)

概要:该文章参考了《设计模式之禅》一书及一些前辈的博客文章1.该文章阐述了代理模式的基础原理及示例代码; 2.该文章适合初学设计模式的技术人员研习; 3.该文章有许多不足之处,请各位大咖指正,喷子绕道; 4.该文章后续《JAVA的23种设计模式—代理模式(二)》,点此跳转到第二部分正文:代理模式:为其他对象提供一种代理以控制对这个对象的访问1.代理模式原理示例代码:package com.cs

Ingram的博客 461

java设计模式之代理模式(一)--静态代理

代理

qq_32940527的博客 196

Java设计模式:代理模式(一)

问题的提出 现在生活中,常常在微信朋友圈里面看到代购的信息,你想在国外买什么,香港买什么,但是又懒得自己过去,于是常常委托别人帮忙买奶粉买那啥的。这类问题的缘由是因为客户和原产地没有直接的接触,所以需要一个代理(代购)的第三者来实现间接引用。代理对象可以在客户端和目标对象间起到中介作用,而且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。代理模式是一种很好实现客户对象与代...

weixin_33756418的博客 175

Java设计模式(一)——代理模式

有高手云:了解设计模式才算是入门级的程序员。 所以为了入门我打算把我学习到的设计模式逐条总结下来。和别人的文章不同,我几乎只提供了测试源码与细节分类。原因是,我相信对于设计来说,你永远无法给出终极答案。不同的人看到会有不同的理解,所以大家一起讨论吧。 一、静态代理 设计测试接口,提供request()方法 package proxy.staticproxy; public i...

weixin_30449453的博客 109

Java设计模式---代理模式(一)

代理模式 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代 理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代 理人虽然不能干活,但是被代理的人能干活呀。 比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程 序上时这样的:   先定义一种类型的女人:   package com.cbf4lif

Discovering,Thinking and Finding——This Is My Logic 391

JAVA知识之设计模式(一):代理模式

代理模式的概念代理模式就是屏蔽用户对真实对象的访问,而是使用代理对象完成用户的请求。代理对象可以完成真实对象的所有功能,也可以添加特有的和真实对象无关的新功能。 生活中也常常见到代理模式的应用,例如我们可以到火车票代理点去购买火车票,代理点就是代理对象,替代火车站售票处来做发售车票的工作。著名的spring框架核心功能AOP也是应用了代理模式,将业务代码和系统代码解耦分离。 代理模式也能用来实现

超级马的博客 469

JAVA设计模式之---代理模式(一)

前言 今天学习了代理模式,尽管只是对静态代理有了一点理解,但还是非常开心的总结一下. -. 静态代理 -. 继承代理 -. 聚合代理 继承代理 首先是要讲述的是继承代理 下面是我创建继承代理的过程,如下: 创建接口 package proxy.mayong.org; public interface Moveable { void move();//这里定义一个方法 } 创建一个实...

走在成功的路上 221

Java设计模式用孙悟空打开代理模式(附实例代码)每天一学设计模式

代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。 (1)Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真是主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。 (2)Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。通常,在代理主题角色的客户端在调用真实=主题操作前

weixin_42199290的博客 5237
上一篇: 抽象类与接口
下一篇: java设计模式--代理模式(二)
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值