设计模式-代理模式

(超详细)互补格雷码+相移码求解包裹相位(Python实现) 记录实现“互补格雷码+相移码”求解包裹相位的编码过程。也可以叫它“5+4”法,5代表五幅格雷码图像,4代表四步相移法的四张正弦条纹图。 阅读详情

普通代理模式

  1. 定义一个接口 Subject
  2. 该接口的实现类 RealSubject
  3. 代理实现类的类 ProxySubject 实现接口同时内部含有一个实现类的实例
public interface Subject{

    void execute();
}

public class RealSubject implements Subject{

    @Override
    public void execute(){
        System.out.println("execute real subject");
    }
}

public class ProxySubject implements Subject{
    private RealSubject realSubject;
    
    public ProxySubject(RealSubject realSubject){
        this.realSubject = realSubject;
    }
    
    @Override
    public void execute(){
        System.out.println("before");
        realSuject.execute();
        System.out.println("after");
    }
}

public class Client{

    public static void main(String[] args){
        Subject subject = new ProxySubject(new RealSubject());
        subject.execute();
    }
}

动态代理

分为两种实现

  • JDK代理
  • Cglib代理

JDK代理

  1. 定义接口Subject;
  2. 使用 java.lang.reflect.Proxy 类;
  3. 代理类实现 InvocationHandler 接口;

注意:只能基于接口进行动态代理。

public interface Subject{

    void execute();
}

public class RealSubject implements Subject{
    
    @Override
    public void execute(){
        System.out.println("execute real subject");
    }
}

public class ProxySubject implements InvocationHandler{

    private RealSubject realSubject;
    
    public ProxySubject(RealSubject realSubject){
        this.realSubject = realSubject;
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

       System.out.println("before jdk");
       Object result = null;
       try {
          result = method.invoke(realSubject, args);
       } catch (Exception e) {
          System.out.println("ex:");
          throw e;
       } finally {
          System.out.println("after jdk");
       }
       return result;
    }
}

public class Client{

    public static void main(String[] args){
        
        //生成代理类的实现类
        Subject subject = (Subject)Proxy.newProxyInstance(Client.class.getClassLoader(),new Class[]{Subject.class},new ProxySubject(new RealSubject));
        subject.execute();
    }
}

Cglib代理

通过继承的方法实现。

maven中引入cglib依赖

<dependency>
	<groupId>cglib</groupId>
	<artifactId>cglib</artifactId>
	<version>3.2.10</version>
</dependency>

继承 MethodInterceptor 接口。

public class CglibProxy implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        System.out.println("before cglib");
        Object result = null;
        try {
            result = methodProxy.invokeSuper(o, objects);
        } catch (Exception e) {
            System.out.println("ex:" + e.getMessage());
            throw e;
        } finally {
            System.out.println("after cglib");
        }
        return result;
    }
}

public class Client {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);
        enhancer.setCallback(new CglibProxy());
        Subject subject = (Subject) enhancer.create();
        subject.execute();
    }
}

jdk和cglib代理比较

  1. JDK只能通过针对有接口的类的接口方法进行动态代理。
  2. Cglib基于继承实现动态代理,无法对static、final类进行代理。
  3. Cglib基于继承实现动态代理,无法对private、static方法进行代理。
【从零开始学Skynet】基础篇(一):Skynet环境搭建 Skynet运行于Linux操作系统,我们可以在自己的电脑上搭建虚拟机系统,也可以购买阿里云、腾讯云服务器,笔者这个系列的所有代码都是在Ubuntu16.04版本的虚拟机系统下运行编辑。 阅读详情

相关推荐

计算机组成原理课设

计算机组成原理课程设计

qq_63306482的博客 8016

Spring中涉及的设计模式

策略模式 Spring框架的资源访问Resource接口 。该接口提供了更强的资源访问能力,Spring 框架本身大量使用了 Resource 接口来访问底层资源。 Resource 接口介绍–》source 接口是具体资源访问策略的抽象,也是所有资源访问类所实现的接口。 Resource 接口主要提供了如下几个方法 getInputStream():定位并打开资源,返回资源对应的输入流。每次调用都返回新的输入流。 调用者必须负责关闭输入流。 exists():返回 Resource 所指向的资源是否存

weixin_44971379的博客 420

(五)C++自制植物大战僵尸游戏LoadingScene的实现讲解

游戏启动后就会立即切换到游戏加载场景中。只有游戏资源文件加载完成后,才能进入游戏。Loadingscene类继承Cocos2d-x中的Scene父类,表明Loadingscene是一个场景类。切换到LoadingScene场景中,首先会创建该场景,会调用函数,在该函数中调用自己定义的方法实现指定功能。代码文件的位置如下图所示。

尔灵尔亿的博客 1970

设计模式的资源

面向对象和设计模式的理解 https://www.cnblogs.com/pony1223/p/7594803.html

从一点一滴做起 275

设计模式-资源工厂(Resource Factory) - 对象创建型

资源工厂(Resource Factory)- 对象创建型 设计模式   资源工厂 (Resource Factory) v1.0     资源工厂(Resource Factory)- 对象创建型 1.名称 资源工厂(Resource Factory) 2.版本 1.0 3.意图 用统一的方法来创建不同的对象,而不用关心此对象是如何创建出来的,来自何处。 4.动机 应用系统中

WJian的专栏 3725

Spring完美设计:Resource接口与策略模式

不管是资源(Resource),还是资源加载器(ResourceLoader),Spring都把它定义成了接口的形式,而不是类的形式。这样降低了与具体的实现类之间的耦合,更具灵活性与易扩展性。它们的关系图如下:     且看ResourceLoader的getResource(String location)方法的声明: /** * Return a Resource handle...

心梦帆影Java技术博客 927

编码剖析@Resource注解的实现原理

上文我们已经学会使用@Resource注解注入属性。学是学会了,但也仅限于会使用而已,故我们要深入剖析其内部原理,才算真正明白。接下来我们就来编码剖析@Resource注解的实现原理,但这都是建立在用@Resource注解完成属性装配的案例基础上的。 由于我们要使用dom4j工具来读取Sping的配置文件——beans.xml,所以需要将dom4j所需的jar包导入项目中。dom4j所需的jar包

李阿昀的博客 8319

设计模式代理模式(ProxyPattern)

设计模式代理模式(ProxyPattern) 1.图和分析 有三个角色: 代理角色 :房屋中介,代理真实角色,一般会进行一些附属操作 真实角色:房主,执行自己的业务代码即可 抽象角色:租房,一般是接口或者抽象类 2.静态代理 根据上面的图,代码实现 租房接口(interface) public interface Rent { void rent(); } 房主类,实现...

qq_38056518的博客 238

设计模式代理模式ProxyPattern(六)

1、什么是代理模式代理模式是23种设计模式中的一种。代理模式是一种结构型设计模式,它允许为其他对象提供一个替代品或占位符,以控制对这个对象的访问。2、代理模式的角色构成抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样代理类可以通过实现该接口来代理真实主题。真实主题(Real Subject):定义了代理所代表的真实对象。代理(Proxy):持有对真实主题的引用,并实现了与真实主题一样的接口,客户端通过代理来访问真实主题,同时可以在访问真实主题前后进行一些额外操作。

徐泗空的博客 1434

[DesignPattern]ProxyPattern

代理模式玩过扮白脸、扮黑脸的游戏吗?这就是代理要做的:控制和管理访问。还记得状态模式的那台糖果机吗?现在我们需要远程监控糖果机。(在开始编码之前,需要收集需求)。远程代理 远程代理就好比“远程对象的本地代表”。何谓“远程对象“?这是一种对象,活在不同的Java虚拟机(JVM)堆中。 你的客户对象所做的就像是在做远程方法调用,但其实只是调用本地堆中的”代理“上的方法,再由代理处理所有网络通信的低层细节

xy_cpp的博客 408

您的设计模式——代理模式【Proxy Pattern 】

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

407

设计模式代理模式

代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 意图:为其他对象提供一种代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来...

dmxhcwk90096748的博客 92

java设计模式代理模式【Proxy Pattern】 详解

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

蛋蛋淡淡定的庄园 284

设计模式代理模式(ProxyPattern)

核心模块:抽象角色,真实角色,代理角色 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:适合不方便直接访问对象的情况; 优点:协调了调用者和被调用者,减少耦合,起到了保护目标对象的作用; 缺点:由于使用代理可能会使请求速度变慢; 注意: 1,与中介者模式区别,中介者对中介双方权重

didiao11300的专栏 345

设计模式---代理模式(DesignPattern_Proxy)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 133

java 简易的资源池_资源池设计模式 (Resource Pool)和数据池的简单实现

翻译到了一半,感觉还是看原味的比较好点,翻译过的东西和原味的怎么都是有差别。有人想看的话我给贴出来。Object PoolDesign PatternIntentObject pooling can offer a significant performance boost; it is most effective in situations where the cost of initial...

weixin_35867979的博客 667

MyBatis 和 Spring 中的 15 种设计模式,真香,拿去用吧!

不少人只会用框架,却看不懂源码,不了解其底层机制与实现原理,成了一名只会搬运源码库的开发。例如大家都知道Mybatis有9个设计模式,但是大多人只是停留在概念层面,真实开发中很少应用到,...

Java技术栈,分享最主流的Java技术 1146

资源池设计模式 (Resource Pool)和数据池的简单实现

本人摘自:http://sourcemaking.com/design_patterns/object_pool Object PoolDesign Pattern Intent Object pooling can offer a significant performance boost; it is most effective in situations where th...

weixin_30325793的博客 678

设计模式精讲】3.统一建模语言(UML)速览

【摘要】:同一段设计,有人用两百条群消息仍说不清,有人用一张图五分钟达成共识。UML 的价值不是把系统画得复杂,而是选择合适视角,准确回答“有哪些角色”“谁依赖谁”“运行时谁先调用谁”“对象经历哪些状态”。本文以 Mermaid 为绘图工具,介绍类图、序列图、状态机图、用例图和活动图,重点讲透前三种。类图部分不再把不同关系硬排成一条强弱链,而是区分使用与整体关系、类型关系,并给出与 C++ 所有权和多态机制一致的代码;随后用订单事件和订单生命周期演示时序与状态表达,最后总结选图方法和常见误区。

码工许师傅 453

设计模式精讲】4.单例模式(Singleton)

【摘要】:全局配置、日志器、线程池,这类对象在整个进程里只需要一份。多数人的第一反应是定义一个全局变量,随后便陷入初始化顺序失控、重复构造、多线程竞争的泥潭。本文从全局变量的三宗罪讲起,给出单例模式的意图与结构;重点拆解 C++ 中线程安全单例的三种写法——Meyers’ Singleton、双检锁的坑与修正、std::call_once,并比较它们的行为差异。文章最后讨论单例的代价与替代方案,提醒读者:单例是受限的全局状态,能少用就少用。

码工许师傅 496

基于YOLO11深度学习的麦穗识别检测系统(带GUI界面)(Python源码+Pyqt5界面+1690多张标注好的数据集+安装使用教程+训练好的模型+评估指标曲线+演示图片视频),开箱即用

基于YOLO11深度学习的麦穗识别检测系统(带GUI界面)(Python源码+Pyqt5界面+1690多张标注好的数据集+安装使用教程+训练好的模型+评估指标曲线+演示图片视频),开箱即用高准确率,1个类别:麦穗。1、该资源内项目代码都经过本人训练测试并运行成功,功能都OK的情况下才上传的,请放心下载使用!有问题请私信我,提供技术支持。2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、日常作业、实战项目演示等。3、可参考学习,也可在此基础上略做修改,以实现其他功能,也可直接用于毕设、课设和作业等。资源详情展示:https://blog.csdn.net/m0_37302966/article/details/149333480更多资源下载:https://blog.csdn.net/m0_37302966/article/details/146387003

用JavaScript调用WebService的示例

JavaScript用htc实现WebService的调用

下一篇: Zookeeper + Dubbo 安装 for mac
resourcej
博客等级 码龄8年 0粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值