代理模式小结

    代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    再看看代理模式的UML图

    代理模式的分类:静态代理和动态代理,其中动态代理分为JDK动态代理和CGLIB动态代理,在本文章中只讲静态代理和JDK动态代理。

    在我看来静态代理和动态代理的唯一区别就是在代理这块是如何实现的,如果他在代理类中直接引用了真实对象,那他使用的就是静态代理。反之他如果是通过实现了invocationHandler的接口,并且在代理类中使用的是Objec来代表真实对象,然后通过invoke方法知道了真实对象的种类以及方法,那么他就是动态代理。换句话说也就是在代理的实现部分中,代理类并不知道将来自己要替那个真实对象去办什么事情。

    下面看静态代理的代码实现:

package com.tgb;

/**
 * Created by lenovo on 2017/7/24.
 */


abstract class AbstractObject{
    public abstract void operation();
}
class RealObject extends AbstractObject{

    @Override
    public void operation() {
        System.out.println("realObject的一下操作");
    }
}
class ProxyObject extends AbstractObject{
    //引用真实对象
    private RealObject realObject=new RealObject();
    public ProxyObject(RealObject realObject){
        this.realObject=realObject;
    }
    @Override
    public void operation(){
        System.out.println("代理之前");
        //调用真实对象的操作方法
        realObject.operation();
        System.out.println("代理之后");
    }
}
class test{
    public static void main(String[] args) {
        RealObject realObject= new RealObject();
        ProxyObject proxyObject=new ProxyObject(realObject);
        proxyObject.operation();
    }
}
    再接下来看动态代理的代码实现

package com.tgb;

import java.lang.annotation.Target;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by oxj on 2017/7/24.
 */
public class 动态代理 {
}
interface Service{
    public abstract void add();
}
class UserServiceImpl implements Service{
    public void add(){
        System.out.println("这是添加的方法");
    }
}

//jdk动态代理(通过实现InvocationHandler接口,重写invoke方法)
class MyInvocationHandler implements InvocationHandler{
    //这个Object类型的target就显示了这个是动态代理,在静态代理这部分是定义真实类型的真实对象
    private Object target;
    MyInvocationHandler(Object target){
        this.target=target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)throws Throwable{
        System.out.println("动态代理之前");
        Object result=method.invoke(target,args);
        System.out.println("动态代理之后");
        return result;
    }
    //通过类加载器获得当前的代理
    public Object getProxy(){
        ClassLoader classLoader=Thread.currentThread().getContextClassLoader();
        Class<?>[] interfaces=target.getClass().getInterfaces();
        //这里调用了Proxy类的静态方法newProxyInstance的方法
        return Proxy.newProxyInstance(classLoader,interfaces,this);
    }
}
class  ProxyTest{
    public static void main(String[] args) {
        Service service=new UserServiceImpl();
        MyInvocationHandler myInvocationHandler= new MyInvocationHandler(service);
        Service serviceProxy = (Service) myInvocationHandler.getProxy();
        serviceProxy.add();
    }
}


    相信看了这两个例子之后,大家就很明白动态代理和静态代理的区别了,懂了他们,spring容器这块的内容就很容易理解了。


饰模式: 装饰模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。装饰模式的核心思想是:用装饰对象包装真实对象,从而在装饰对象上动态添加功能。装饰模式可以在不改变对象自身的基础上,在程序运行期间给对象动态地添加功能,这也是装饰模式的优点之一。 代理模式代理模式是一种结构型设计模式,它允许你提供一个代替品或占位符,以控制对其它对象的访问。代理模式的核心思想是:通过代理对象来控制对真实对象的访问,代理对象真实对象实现相同的接口,客户端无需知道代理对象真实对象的区别,从而达到客户端真实对象解耦的目的。 桥接模式: 桥接模式是一种结构型设计模式,它可以将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。桥接模式的核心思想是:将抽象部分实现部分分离,使它们可以独立地变化。这样一来,两者的变化不会相互影响,从而达到解耦的目的。 组合模式: 组合模式是一种结构型设计模式,它允许你将对象组合成树状结构,并且能像使用独立对象一样使用它们。组合模式的核心思想是:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 适配器模式: 适配器模式是一种结构型设计模式,它允许你将不兼容的对象包装在适配器中,以使其另一个类兼容。适配器模式的核心思想是:将一个类的接口转换成客户希望的另一个接口。适配器模式可以让原本由于接口不兼容而不能一起工作的类可以一起工作。 外观模式: 外观模式是一种结构型设计模式,它为复杂的子系统提供一个简单的接口。外观模式的核心思想是:为子系统中的一组接口提供一个一致的界面,以便于客户端使用。外观模式可以让客户端子系统之间的耦合度降低,从而提高系统的可维护性和可扩展性。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值