代理模式

一、什么是代理模式

简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。

二、动态代理

2.1、被代理的接口

public interface Demo {

    void test1();

    void test2();
}

2.2、被代理的对象(实现了被代理接口的对象)

public class DemoImpl implements Demo {

    @Override
    public void test1() {
        System.out.println("=====执行test1()=======");
    }

    @Override
    public void test2() {
        System.out.println("=====test2()=======");
    }
}

2.3、代理对象

public class MyHandler implements InvocationHandler {

    //代理对象
    private Object targer;

    public MyHandler(Object targer) {
        this.targer = targer;
    }

    @Override
    public Object invoke(Object obj, Method method, Object[] objects) throws Throwable {
        System.out.println("==代理对象执行额外业务================");
        //记录日志、权限控制、事务处理 ... ...
        return method.invoke(targer,objects);//代理对象执行被代理对象的方法
    }

    public static void main(String[] args){
        Demo targer = new DemoImpl(); //(真实)被代理对象
        MyHandler handler = new MyHandler(targer); //代理对象
        Demo proxyDemo = (Demo) Proxy.newProxyInstance(MyHandler.class.getClassLoader(),
                new Class[]{Demo.class},handler);//使用反射生成一个被代理的对象
        proxyDemo.test1();
        proxyDemo.test2();
    }
}

三、静态代理

3.1、被代理的接口

public interface Demo {
    void test1();
}

3.2、被代理的对象

public class DemoImpl implements Demo {
    @Override
    public void test1() {
        System.out.println("=====执行test1()=======");
    }
}

3.3、代理对象

public class DemoProxy implements Demo{

    private Demo demo;

    public DemoProxy(Demo demo) {
        this.demo = demo;
    }


    @Override
    public void test1() {
        System.out.println("该方法使用静态代理之前执行。。。");
        demo.test1();
        System.out.println("该方法使用静态代理之后执行。。。");
    }


   public static void main(String[] args) {
        Demo demo = new DemoImpl();
        Demo demoProxy = new DemoProxy(demo);
        demoProxy.test1();
   }
}

四、Cglib代理

4.1、被代理的对象

public class Demo {
    public void test1() {
        System.out.println("=====执行test1()=======");
    }
}

4.2、Cglib代理对象工厂

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/** Cglib子类代理工厂
 * 创 建 时 间: 2019/10/20
 * 版       本: V1.0
 * 作       者: qixin
 * 版 权 所 有: 版权所有(C)2019-2029
 */
public class ProxyFactory implements MethodInterceptor {

    private Object target; // 维护目标对象

    public ProxyFactory(Object target) {
        this.target = target;
    }

    // 给目标对象创建一个代理对象
    public Object getProxyInstance(){
        Enhancer en = new Enhancer(); //1.工具类
        en.setSuperclass(target.getClass());  //2.设置父类
        en.setCallback(this);  //3.设置回调函数
        return en.create();  //4.创建子类(代理对象)
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("向观众问好");
        //执行目标对象的方法
        Object returnValue = method.invoke(target, objects);
        System.out.println("谢谢大家");
        return returnValue;
    }

    public static void main(String[] args) {
        Demo demo = new Demo(); //目标对象
        //代理对象
        Demo proxy = (Demo)new ProxyFactory(demo).getProxyInstance();
        proxy.test1(); //执行代理对象的方法
    }
}

五、动态代理使用场景:权限校验

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface PrivilegeInfo {
	String value(); //权限名称
}

public interface OrderService {
	// 添加订单
	@PrivilegeInfo("生成订单")
	public void add(User user, Order order) throws PrivilegeException,
			Exception;
	// 根据用户查找订单
	@PrivilegeInfo("查看订单")
	public List<Order> find(User user) throws PrivilegeException, Exception;
	// 根据id删除订单
	public void delete(String id) throws Exception;
}

public class OrderServiceFactory {
	private static OrderService service = new OrderServiceImpl();

	public static OrderService getInstance() {
		return (OrderService) Proxy.newProxyInstance(
				service.getClass().getClassLoader(),
				service.getClass().getInterfaces(),
				new InvocationHandler() {
					public Object invoke(Object proxy, Method method,
							Object[] args ) throws IllegalAccessException,
							IllegalArgumentException, InvocationTargetException {
						// 1.判断是否有注解
						if (method.isAnnotationPresent(PrivilegeInfo.class)) {
							// 2。得到注册对象
							PrivilegeInfo pif = method.getAnnotation(PrivilegeInfo.class);
							// 3.得到权限名称
							String pname = pif.value();
							// 4.得到用户
							User user = (User) args[0];
							if (user == null) {
								throw new PrivilegeException();
							}
							// 5.根据用户查询是否具有权限
							PrivilegeDao pdao = new PrivilegeDao();
							if (!pdao.checkPrivilege(user.getRole(), pname)) {
								throw new PrivilegeException(); // 抛出权限不足异常
							}
						}
						return method.invoke(service, args);
					}
				});
	}
}

// 使用
// 2.调用OrderService中查询订单操作
OrderService service = OrderServiceFactory.getInstance();
List<Order> orders = service.find(user);
内容概要:该论文深入研究了液压挖掘机动臂下降势能回收技术,旨在解决传统液压挖掘机能耗高的问题。提出了一种新型闭式回路势能回收系统,利用模糊PI自整定控制算法控制永磁无刷直流电动机,实现了变转速容积调速控制,消除了节流和溢流损失。通过建立数学模型和仿真模型,分析了不同负载下的系统性能,并开发了试验平台验证系统的高效性和节能效果。研究还涵盖了执行机构能量分布分析、系统元件参数匹配及电机控制性能优化,为液压挖掘机节能技术提供了理论和实践依据。此外,通过实验验证,该系统相比传统方案可降低28%的能耗,控制系统响应时间缩短40%,为工程机械的绿色化、智能化发展提供了关键技术支撑。 适合人群:从事工程机械设计、制造及维护的工程师和技术人员,以及对液压系统节能技术感兴趣的科研人员。 使用场景及目标:①理解液压挖掘机闭式回路动臂势能回收系统的原理和优势;②掌握模糊PI自整定控制算法的具体实现;③学习如何通过理论建模、仿真和实验验证来评估和优化液压系统的性能。 其他说明:此研究不仅提供了详细的理论分析和数学建模,还给出了具体的仿真代码和实验数据,便于读者在实际工作中进行参考和应用。研究结果表明,该系统不仅能显著提高能源利用效率,还能延长设备使用寿命,降低维护成本,具有重要的工程应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值