设计模式-代理模式

审配
• 阅读 1585

代理模式定义

代理模式 是指为其他对象提供一种代理,以控制对这个对象的访问

静态代理模式

demo:大部分的房主会把房子交给中介去出租,那么这个场景就是房主是真实类,中介是代理类(帮助房主出租房子),直接上代码

顶层接口

public interface IBuyHouse {

void renting();  

}

房主

public class Homeowner implements IBuyHouse {  
    @Override  
 public void renting() {  
        System.out.println("customer: i want to buy house");  
 }  
}

中介

public class IntermediaryProxy implements IBuyHouse {  
  
    private IBuyHouse iBuyHouse;  
  
 public IntermediaryProxy(IBuyHouse iBuyHouse) {  
        this.iBuyHouse = iBuyHouse;  
 }  
  
    @Override  
 public void renting() {  
        before();  
        iBuyHouse.renting();  
        after();  
 }  
  
    private void before() {  
        System.out.println("中介和客户沟通 ,要找一个什么样的房子");  
  
 }  
    private void after() {  
        System.out.println("达成协议,交定金");  
 }  
}

测试

public static void main(String[] args) {  
    IBuyHouse iBuyHouse = new IntermediaryProxy(new Homeowner());  
 iBuyHouse.renting();  
}

这样就完成了一个代理类的调用
接下来我们,我们看看如何实现动态代理

动态代理(java)

中介(代理类)

public class IntermediaryProxy implements InvocationHandler {  
  
    private IBuyHouse target;  
 public IBuyHouse instance(IBuyHouse target){  
        this.target = target;  
 Class<? extends IBuyHouse> aClass = target.getClass();  
 return (IBuyHouse) Proxy.newProxyInstance(aClass.getClassLoader(), aClass.getInterfaces(), this);  
 }  
  
    @Override  
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
        before();  
 Object invoke = method.invoke(this.target, args);  
 after();  
 return invoke;  
 }  
  
    private void before() {  
        System.out.println("中介和客户沟通 ,要找一个什么样的房子");  
  
 }  
  
    private void after() {  
        System.out.println("达成协议,交定金");  
 }  
  
}
// 调用
public static void main(String[] args) {  
    IBuyHouse instance = new IntermediaryProxy().instance(new Homeowner());  
 instance.renting();  
}

通过Proxy.newProxyInstance(...)创建一个代理类,然后调用重写的invoke方法去实现逻辑。
以上是jdk提供的一种方法,接下来我们用Cglib实现一下

cglib实现动态代理

public class IntermediaryProxy implements MethodInterceptor {  
  
    public Object instance(Class<?> clazz){  
        Enhancer enhancer = new Enhancer();  
 enhancer.setSuperclass(clazz);  
 enhancer.setCallback(this);  
 return enhancer.create();  
 }  
  
    @Override  
 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {  
        before();  
 methodProxy.invokeSuper(o, objects);  
 after();  
 return null; }  
  
    private void before() {  
        System.out.println("中介和客户沟通 ,要找一个什么样的房子");  
  
 }  
  
    private void after() {  
        System.out.println("达成协议,交定金");  
 }  
  
}
// 调用
public static void main(String[] args) {  
    Homeowner homeowner = (Homeowner) new IntermediaryProxy().instance(Homeowner.class);  
 homeowner.renting();  
 homeowner.getMoney();  
}

用cglib实现动态代理是不需要通过接口的 也就是之前的IBuyHouse 是不需要创建的,cglib代理类是直接继承真实类去实现代理的。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)
  代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程1\.举例使用cglib代理需要引入两个包,maven的话包引入如下<!https://mvnrepository.com/artifact/cglib/cglib<dependency
Wesley13 Wesley13
3年前
java模式之一
代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问代理模式的三种实现(1)静态代理静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.eg publicinterfacePammerDao{   voiddomain();}publicTargetimpl
Wesley13 Wesley13
3年前
java技术学习路线(自用)
一:常见模式与工具    1.常用设计模式:                 1.1.Proxy代理模式:指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。详见https://www.cnblogs.com/qifengshi/p/6566752.html       
Wesley13 Wesley13
3年前
JDK动态代理和Cglib的动态代理
最简单的是静态代理方法,即代理模式,这里就不多啰嗦了。。重点说一下JDK的动态代理和Cglib的动态代理吧先说JDK的,需要被代理的类需要有接口,否则无法实现package proxy.dynamic;public interface IBook {void add();}实现接口
Wesley13 Wesley13
3年前
Java 通过getbean取出的类为什么要强转为接口类
这个问题是之前一个同学问我的,这些是我在网上找到的资料,由于我自己也没有完全搞明白,先大概记录一下首先问题是为什么在bean文件中注入的是实现类,但是通过getBean()取出的时候却必须强制转化为接口类。这个问题应该是和spring中配置的代理模式相关的,即到底是使用JDK动态代理还是Cglib代理。关于代理模式这个问题spring的文档中这么
Wesley13 Wesley13
3年前
Java中jdk代理和cglib代理
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中代理模式从实现方式上可以分为两个类别:静态代理和动态代理静态代理:也就是我们学习设计模式之代理模式时常见的事例,具体不在赘述,参见:
Wesley13 Wesley13
3年前
JavaWeb之动态代理解决request请求编码问题
动态代理解决编码问题1.设计模式出现原因:软件开发过程中,遇到相似问题,将问题的解决方法抽取模型(套路)常见设计模式:单例,工厂,适配器,装饰者,动态代理。2.装饰者模式简单介绍谷歌汽车开发场景1.Java定义了汽车开发约定interfaceICar{s
Wesley13 Wesley13
3年前
Java代理模式的实现方式
代理模式是23种设计模式之一,定义为:为其他对象提供一种代理以控制对这个对象的访问。简单来说就是在调用方无感知的情况下,修改原有的行为。\TOC\静态代理即通过手动编码方式实现publicinterfaceIFooService{voidfoo();}publicclass
Wesley13 Wesley13
3年前
Java设计模式_(结构型)_代理模式
引用百科即ProxyPattern,23种常用的面向对象软件的设计模式之一。代理模式的定义:为其他对象提供一种代理(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E4%25BB%25A3%25E7%2590%25
待兔 待兔
1年前
Java设计模式之 - 代理模式
代理模式的介绍:代理模式也称为委托模式,在开发中经常用到,是编程的好帮手,在日常生活中也比较常见。比如公司中午让同事帮忙带一份饭,比如我们请一个律师打官司,比如我们用代理服务器上网等等。代理模式真是无处不在。代理模式的定义:为其它对象提供一种代理以控制对这
审配
审配
Lv1
你在我这里无法保存,因为你过于庞大,内存不足。
文章
4
粉丝
0
获赞
0