代理模式

一、什么是代理模式?

代理模式(Proxy Pattern):即一个类别可以作为其它东西的接口。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 

二、代理模式的角色和职责

 subject: 真实主题与代理主题的共同接口。

 RealSubject:定义了代理角色所代表的真实对象。 

 Proxy:代理角色内部包含有对真实对象的引用,所以它可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。 

三、优缺点及应用场景:

优点:

1、代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
2、代理对象可以在客户端和目标对象之间起到中介的作用,如在虚拟代理中,可以通过使用一个小对象来代表一个大对象,从而减少系统资源的消耗,对系统进行优化并提高运行速度。

缺点:

1、在客户端和真实主题之间增加了代理对象, 可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

应用环境:

1、 远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2、 虚拟代理:通过使用过一个小的对象代理一个大对象。这样就可以减少系统的开销。
3、 保护代理:用来控制对真实对象的访问权限。

四、具体代码:

1>:静态代理

/**
 * @Title: Subject.java
 * @Package
 * @Description: Subject接口
 * @author xiaozhi
 * @date 2016年12月6日 下午6:53:34
 * @version V1.0
 */

public interface Subject {
    public void sellBook();
}
/**
 * @Title: RealSubject.java
 * @Package
 * @Description: 真实产品
 * @author xiaozhi
 * @date 2016年12月6日 下午6:53:51
 * @version V1.0
 */

public class RealSubject implements Subject {

    @Override
    public void sellBook() {
        System.out.println("卖书");

    }

}
/**
 * @Title: ProxySubject.java
 * @Package
 * @Description: 代理类
 * @author xiaozhi
 * @date 2016年12月6日 下午6:54:04
 * @version V1.0
 */

public class ProxySubject implements Subject {
    // 引用真实产品类
    private RealSubject realSubject;

    public void setRealSubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void sellBook() {
        dazhe();
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        this.realSubject.sellBook();
        give();
    }

    public void dazhe() {
        System.out.println("打折");
    }

    public void give() {
        System.out.println("赠送代金卷");
    }

}
/**
 * @Title: MainClass.java
 * @Package
 * @Description: 静态代理测试类
 * @author xiaozhi
 * @date 2016年12月6日 下午6:53:16
 * @version V1.0
 */

public class MainClass {
    public static void main(String[] args) {
        RealSubject rs = new RealSubject();
        rs.sellBook();
        System.out.println("。。。。。。。。。。。。。。。");
        ProxySubject ps = new ProxySubject();
        ps.sellBook();
    }

}

2>:动态代理:

package com.Proxy.dynamic;
/**   
* @Title: Subject.java
* @Package 
* @Description: TODO(用一句话描述该文件做什么)
* @author xiaozhi   
* @date 2016年12月6日 下午6:53:34
* @version V1.0   
*/

public interface Subject {
    public void sellBook();
}
package com.Proxy.dynamic;

/**
 * @Title: RealSubject.java
 * @Package
 * @Description: TODO(用一句话描述该文件做什么)
 * @author xiaozhi
 * @date 2016年12月6日 下午6:53:51
 * @version V1.0
 */

public class RealSubject implements Subject {

    @Override
    public void sellBook() {
        System.out.println("卖书");

    }

}
/**   
* @Title: MyHandle.java
* @Package com.Proxy.dynamic
* @Description: 通过注解和反射机制动态代理
* @author xiaozhi   
* @date 2016年12月6日 下午7:12:18
* @version V1.0   
*/

package com.Proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyHandler implements InvocationHandler {
    private RealSubject realSubject;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        dazhe();
        result = method.invoke(realSubject, args);
        give();

        return result;
    }

    public void dazhe() {
        System.out.println("打折");
    }

    public void give() {
        System.out.println("赠送代金卷");
    }

    public RealSubject getRealSubject() {
        return realSubject;
    }

    public void setRealSubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

}
/**   
* @Title: Main.java
* @Package com.Proxy.dynamic
* @Description: TODO(用一句话描述该文件做什么)
* @author xiaozhi   
* @date 2016年12月6日 下午7:11:21
* @version V1.0   
*/

package com.Proxy.dynamic;

import java.lang.reflect.Proxy;

public class MainClass {
    public static void main(String[] args) {
        RealSubject rs = new RealSubject();
        MyHandler myHandler = new MyHandler();
        myHandler.setRealSubject(rs);
        Subject ProxySubject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(),
                rs.getClass().getInterfaces(), myHandler);
        ProxySubject.sellBook();
    }
}

五、测试结果:
<1>

卖书
。。。。。。。。。。。。。。。
打折
卖书
赠送代金卷 

<2>

打折
卖书
赠送代金卷
STM32电机库无感代码注释无传感器版本龙贝格观测三电阻双AD采样前馈控制弱磁控制斜坡启动内容概要:本文档为一份关于STM32电机控制的无传感器版本代码注释资源,聚焦于龙贝格观测器在永磁同步电机(PMSM)无感控制中的应用。内容涵盖三电阻双通道AD采样技术、前馈控制、弱磁控制及斜坡启动等关键控制策略的实现方法,旨在通过详细的代码解析帮助开发者深入理解基于STM32平台的高性能电机控制算法设计与工程实现。文档适用于从事电机控制开发的技术人员,重点解析了无位置传感器控制下的转子初始定位、速度估算与系统稳定性优化等问题。; 适合人群:具备一定嵌入式开发基础,熟悉STM32平台及电机控制原理的工程师或研究人员,尤其适合从事无感FOC开发的中高级技术人员。; 使用场景及目标:①掌握龙贝格观测器在PMSM无感控制中的建模与实现;②理解三电阻采样与双AD同步采集的硬件匹配与软件处理机制;③实现前馈补偿提升动态响应、弱磁扩速控制策略以及平稳斜坡启动过程;④为实际项目中调试和优化无感FOC系统提供代码参考和技术支持; 阅读建议:建议结合STM32电机控制硬件平台进行代码对照阅读与实验验证,重点关注观测器设计、电流采样校准、PI参数整定及各控制模块之间的协同逻辑,建议配合示波器进行信号观测以加深对控制时序与性能表现的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值