设计模式之代理模式

系列文章目录

第一篇:设计模式之观察者模式
第二篇:设计模式之代理模式
第三篇:设计模式之责任链模式
第四篇:设计模式之建造者模式



前言

主要解决:在直接访问对象时带来的问题

何时使用:想在访问一个类时做一些控制,或者想要为类中的某个方法添加新的功能


提示:以下是本篇文章正文内容,下面案例可供参考

一、静态代理

// 代理接口
public interface Users {
    public void addUser();
}

// 实现类
class UserInfo implements Users{
    public void addUser() {
        System.out.println("添加用户");
    }
}
//代理类
class UserProxyImpl implements Users{
	//通过代理接口属性注入
    private Users users;
	
	// 通过构造方法传入代理对象
    public UserProxyImpl(Users users) {
        this.users = users;
    }

	// 实现代理方法
    public void addUser() {
        System.out.println("开始添加用户。。。");
        // 代理方法一般只做增强,不做修改,原来的逻辑不动
        users.addUser();// 调用原来的方法
        System.out.println("添加成功。。。");
    }

    public static void main(String[] args) {
        Users users=new UserProxyImpl(new UserInfo());
        users.addUser();
    }
}

二、动态代理

1.1 Jdk 代理

// 代理接口
public interface Color {
    void scribble();
}

// 代理接口实现类
public class Green implements Color{
    @Override
    public void scribble() { System.out.println("绿色"); }
}

// 代理类
public class ColorProxy implements InvocationHandler {
    private Color color;

    public ColorProxy(Color color) {
        this.color = color;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    	// 此处可以实现自己的逻辑 
        return method.invoke(color,args);
    }

    public <T> T getProxy() {
        return (T) Proxy.newProxyInstance(color.getClass().getClassLoader(),color.getClass().getInterfaces(),this);
    }

    public static void main(String[] args) {
		// 调用代理类实现增强
        Color green = new ColorProxy(new Green()).getProxy();
        green.scribble();
    }
}

1.2 Cglib 代理

// 代理类
class Hello1 {
    public String hello() {
        System.out.println("excute hello method");
        return "hello cglib";
    }
}
// 实现MethodInterceptor 接口
public class CglibDemo implements MethodInterceptor {
    public static Object getTarget(Object object){
        Enhancer enchaner = new Enhancer();
        enchaner.setSuperclass(Hello1.class);
        enchaner.setCallback(this);
        return enchaner.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        return methodProxy.invokeSuper(o, objects);
    }

    public static void main(String[] args) {
        Hello1 target = (Hello1) new CglibDemo().getTarget();
        System.out.println(target.hello());
    }
}

总结

后话,想要深入了解Jdk代理需要去了解Java asm框架
ASM是一个通用的 Java 字节码操作和分析框架。它可用于直接以二进制形式修改现有类或动态生成类。ASM 提供了一些常见的字节码转换和分析算法,可以从中构建自定义的复杂转换和代码分析工具。ASM 提供与其他 Java 字节码框架类似的功能,但侧重于 性能。因为它被设计和实现为尽可能小和尽可能快,所以它非常适合在动态系统中使用(当然也可以以静态方式使用,例如在编译器中)

Asm 官方网址 :https://asm.ow2.io/index.html

代理模式是一种结构型设计模式,它提供一个代理对象来代表另一个对象。在代理模式中,有一个被称为实际对象(Subject)和一个被称为代理对象(Proxy)的中介,代理对象持有实际对象的引用,并且可以控制对实际对象的访问。代理模式的主要目的是在不修改原始对象的情况下,为原始对象添加额外的逻辑处理。 代理模式分为多种类型,如远程代理、虚拟代理、保护代理等,它们各自有不同的应用场景: - 远程代理:为远程对象提供一个本地代表。 - 虚拟代理:根据需要创建开销大的对象,通过虚拟代理控制访问这些对象的过程。 - 保护代理:控制对原始对象的访问权限,例如进行权限检查。 代理模式的优点包括: 1. 能够控制对真实对象的访问,并在访问前后添加额外的逻辑。 2. 可以通过代理对象实现延迟加载,即在实际需要时才创建真实对象。 3. 增强了对真实对象的封装,并且可以避免对真实对象的重复引用。 在C#中实现代理模式通常涉及以下步骤: 1. 定义一个接口或抽象类,声明真实对象和代理对象需要实现的方法。 2. 实现真实对象的类,按照接口或抽象类的要求实现具体方法。 3. 实现代理类,它同样实现接口或抽象类,并在方法中持有真实对象的引用,通过调用真实对象的方法来执行所需的操作,同时可以添加额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值