java的代理模式

代理模式,首先要有一个租客,要去找房东,但是找不到房东,所以要找中介,中介再去找房东,中介就是代理角色

中介和房东都要有租房子这个事件

抽象角色:一般会使用接口或者抽象类来解决

真实角色:被代理的角色

代理角色:代理真实角色

客户:访问代理对象的人

分为静态代理和动态代理

静态代理

  好处:1.可以使真实角色(房东)只做自己的方法(租房),不用去管一些公共的方法(签合同)  2.公共类交给代理角色,实现业务分工3.公共业务发生扩展的时候,方便集中管理

缺点:一个真实角色就会产生一个代理角色,代码量太大,开发效率低

我是租房的人,我直接找房东租房,

package com.atguigu.zyk;
//租房的人
public class Client {
    public static void main(String[] args) {
        FangDong fangDong = new FangDong();
        fangDong.rent();
    }
}
package com.atguigu.zyk;

public class FangDong implements Rent{
    @Override
    public void rent() {
         System.out.println("房东要出租房子");
    }
}

是没问题的

但是我要找很多房东,才能找到我想要的房子,很麻烦,我可以直接找一个中介,中介就能帮我找到很多房子,而且中介可以帮我签合同,之类的,很省力。

package com.atguigu.zyk;

public class ZhongJie{
    public static void rent() {
        FangDong fangDong =new FangDong();
        fangDong.rent();
        qianhetong();
    }
    public static void qianhetong(){
        System.out.println("签合同");
    }

}
package com.atguigu.zyk;

public class Client {
    public static void main(String[] args) {
        ZhongJie zhongJie=new ZhongJie();
        ZhongJie.rent();
    }
}

动态代理

动态代理和静态代理角色一样

动态代理的类是动态生成的,不是直接写死的,动态代理分为两大类,

基于接口的动态代理,基于类的动态代理。

基于接口的,就是原生的jdk的动态代理。基于类的动态代理,cglib

也可以通过java字节码实现    javasist

Java代理模式是一种结构型设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。代理对象可以在客户端和目标对象之间充当中介,以便于客户端访问目标对象时,可以在不改变目标对象的情况下添加一些额外的功能,比如安全性、远程访问、缓存等。 在Java中,代理模式可以通过两种方式实现:静态代理和动态代理。静态代理需要手动编写代理类,而动态代理可以在运行时通过反射机制动态生成代理类,更加灵活。 举个例子,假设我们有一个接口`Subject`,其中定义了一些方法。我们希望在调用这些方法时,增加一些额外的日志记录功能。我们可以编写一个代理类`SubjectProxy`,在代理类中实现接口方法并调用目标对象的方法,同时在方法前后添加日志记录的代码。客户端则通过代理类访问目标对象。 静态代理示例代码如下: ```java public interface Subject { void doSomething(); } public class RealSubject implements Subject { @Override public void doSomething() { System.out.println("RealSubject do something."); } } public class SubjectProxy implements Subject { private Subject realSubject; public SubjectProxy(Subject realSubject) { this.realSubject = realSubject; } @Override public void doSomething() { System.out.println("Before do something."); realSubject.doSomething(); System.out.println("After do something."); } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); Subject subjectProxy = new SubjectProxy(realSubject); subjectProxy.doSomething(); } } ``` 动态代理示例代码如下: ```java public class SubjectHandler implements InvocationHandler { private Object target; public SubjectHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before " + method.getName()); Object result = method.invoke(target, args); System.out.println("After " + method.getName()); return result; } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); InvocationHandler handler = new SubjectHandler(realSubject); Subject subjectProxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler); subjectProxy.doSomething(); } } ``` 无论是静态代理还是动态代理,代理模式都可以在不改变目标对象的情况下,为其添加额外的功能,提高代码的可复用性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值