spring代理模式代码

代理模式

就是相当于经纪人,中介,两个实体之间不直接接触,经纪人来处理事情,解耦,更加灵活
歌手接口,对歌手类的进一步抽象:

public interface Singer {
    void singing();
    void danceing();
}

具体歌手小孟
继承歌手接口方法

public class Meng implements Singer {

    @Override
    public void singing() {
        System.out.println("小孟在唱歌");
    }

    @Override
    public void danceing() {
        System.out.println("小孟在跳舞");
    }
}

歌手直接和合作者联系吗,耦合性太强,要找个代理
代理实现加一些方法,唱歌前收费

public class Agent implements Singer{
    private Meng xiaomeng=new Meng();
    @Override
    public void singing() {
        System.out.println("唱歌前收钱!");
        xiaomeng.singing();
    }

    @Override
    public void danceing() {
        System.out.println("跳舞前收钱!");
        xiaomeng.danceing();
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        //Singer接口都实现了,多态,解耦
        Singer singer=new Meng();
        Singer agent=new Agent();
        //反射获取对象
        Object o=Proxy.newProxyInstance(Singer.class.getClassLoader(),singer.getClass().getInterfaces(),
                new SingerHandler(singer));
        //判断是不是Singe类型,if包着,不会因为类型不同直接报错结束
        if(o instanceof Singer) {
            Singer s = (Singer) o;
            s.singing();
            s.danceing();
            s.toString();
            s.hashCode();
        }

        Object o1=Proxy.newProxyInstance(Singer.class.getClassLoader(),agent.getClass().getInterfaces(),
                new SingerHandler(agent));
        if(o1 instanceof Singer){
            Singer s1=(Singer)o1;
            s1.singing();
            s1.danceing();
            s1.toString();
            s1.hashCode();
        }
    }
}
//调用处理器
class SingerHandler implements InvocationHandler{
    private Singer singer;

    public SingerHandler(Singer singer) {
        this.singer = singer;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName());
        //在外层就可以添加方法,不用改变源代码
        //指定ing结尾函数处理
        if(method.getName().endsWith("ing")){
            System.out.println("ing结尾的");
        }
        //每次调用时输出
        System.out.println("加钱");
        //反射调用函数
        return method.invoke(singer,args);
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值