设计模式系列《代理模式》

代理模式

代理模式说白了就是你要做什么,就请个人帮你做。

  • 比如你买不到K40,就花贰佰请黄牛帮忙买(麻了,我就亏了贰佰)。
  • 你写了点不正经的代码,例如爬了些奇怪的网站,被抓了,请律师帮忙打官司。
  • 你有一堆脑残粉,你想赚他的钱,你总不能跟他们要吧,请经纪人/代理人卖周边。

代理模式很容易和修饰器模式弄混,我这里提一嘴:

相同点:
  • 二者都能对功能进行增强
  • 在静态代理模式下需要传递对象,这里和修饰器模式很类似,但值得注意的一点是装饰器模式的对象从没变过,而静态模式变过。
不同点
  • 装饰器模式是在功能外增强,并不会影响你这个类,原本是什么类最后也还是什么类。代理模式使用后,类会改变,不是原本的类了,而是代理的类。
  • 装饰器模式仅仅提供功能增强不会增强的类有所牵制。代理模式会对类施加控制, 并不提供对象本身的增强功能,而是使用代理后的对象进行的增强。

需要看装饰器模式的可以看我的这个文章:装饰器模式

静态代理模式

静态代理模式就是把本体类传进代理类里,让代理类帮我们做增强行为。

  • 写一个接口,代表我的职业
public interface Programmer {
//    身为一个程序猿必须会写代码
    void coding();
}

  • 我叫zsp是一个程序猿

    package static_proxy;
    public class ZSP implements Programmer{
        //    我叫zsp,一个程序猿
        @Override
        public void coding() {
            System.out.println("我叫zsp,一个程序猿,每天都喜欢学新的东西")
        }
    }
    
  • 我很喜欢写代码,但是没什么人看,我需要我崇拜的人Java3y来给我点赞博取关注

    public class Java3y implements Programmer{
    //    Java3y是我很崇拜的一个程序猿,
    //    得到他的点赞会让我很开心
    //    也能让更多人认识我
        private ZSP zsp;
        public Java3y(ZSP zsp){
            this.zsp=zsp;
        }
        public void like(){
            System.out.println("Java3y给我点了一个赞");
        }
        @Override
        public void coding() {
            zsp.coding();
            like();
        }
    }
    
  • 最后,把类装进代理类里,进行代理实现

public class TestStaticProxy {
    public static void main(String[] args) {
        ZSP zsp = new ZSP();
        Programmer java3y = new Java3y(zsp);
        java3y.coding();
    }
}

透明代理模式

透明代理和静态代理的不同就是不需要传递对象给构造方法了,直接在代理类中生成需要方法增强的对象。

举例:3Y看我写的非常好(自吹的),但是就没人看,于是以后每天都帮我点赞,不帮别人点赞了

  • 在静态代理的基础上,对代理类进行修改:
public class Java3y implements Programmer{
    private ZSP zsp;
//透明代理就是:3Y看我写的非常好(自吹的),
// 但是就没人看,于是以后每天都帮我点赞,不帮别人点赞了
    public Java3y() {
        this.zsp = new ZSP();
    }
    public void like(){
        System.out.println("Java3y以后只为我点赞,不帮别人点赞了~");
    }
    @Override
    public void coding() {
        zsp.coding();
        like();
    }
}
  • 进行实现:
public class TestStaticProxy {
    public static void main(String[] args) {
        Programmer java3y = new Java3y();
        java3y.coding();
    }
}

代理模式自定义方法

就是透明模式的功能增强,加了点功能。

举例:自定义代理就是3Y一直给我点赞,导致看我的人越来越多(并没有),然后3Y就想要向我收费了(也没有);

  • 改变的代码只有这里,所以就只贴这个。
package custom_proxy;

public class Java3y implements Programmer {
    private ZSP zsp;
//自定义代理就是3Y一直给我点赞,导致看我的人越来越多(并没有)
//    然后3Y就想要向我收费了(也没有)
    public Java3y() {
        this.zsp = new ZSP();
    }
    public void like(){
        System.out.println("Java3y以后只为我点赞,不帮别人点赞了~");
    }
    public void getMoney(){
        System.out.println("现在点赞要贰佰~");
    }
    @Override
    public void coding() {
        zsp.coding();
        like();
        getMoney();
    }
}

动态代理

动态代理运用的是java自带的一个API,即Proxy。

举例:因为3Y要钱(并没有),所以我交不起钱了,只能请水军。

public class Dynamic_Proxy {
    public static void main(String[] args) {
        ZSP zsp = new ZSP();
        Programmer  programmerWaterArmy  = (Programmer) Proxy.newProxyInstance(zsp.getClass().getClassLoader(), zsp.getClass().getInterfaces(), ((proxy, method, args1) -> {
            if (method.getName().equals("coding")) {
                method.invoke(zsp, args);
                System.out.println("水军,来水评论了");
            } else {
                return method.invoke(zsp, args);
            }
            return null;
        }));
        programmerWaterArmy.coding();
    }
}

这个方法需要传入的三个参数分别是:

  • 生成代理对象使用的类加载器。
  • 生成对象的额接口。
  • 生成代理对象方法里要怎么做。

动态代理和静态代理的区别:

  • 静态代理需要我们传入代理对象。而动态代理不用,他是自己生成的。
  • 使用静态代理时:如果目标对象的接口有很多方法的话,那我们还是得一一实现,这样就会比较麻烦。
  • 使用动态代理时:代理对象的生成,是利用JDKAPI,动态地在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型),并且会默认实现接口的所有方法。

代理模式很容易和修饰器模式弄混,我这里提一嘴:

相同点:
  • 二者都能对功能进行增强
  • 在静态代理模式下需要传递对象,这里和修饰器模式很类似,但值得注意的一点是装饰器模式的对象从没变过,而静态模式变过。
不同点
  • 装饰器模式是在功能外增强,并不会影响你这个类,原本是什么类最后也还是什么类。代理模式使用后,类会改变,不是原本的类了,而是代理的类。
  • 装饰器模式仅仅提供功能增强不会增强的类有所牵制。代理模式会对类施加控制, 并不提供对象本身的增强功能,而是使用代理后的对象进行的增强。

需要看装饰器模式的可以看我的这个文章:装饰器模式

在这,我给上,所有模式的代码:github地址

希望能得到大家的star

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值