【JAVA设计模式】代理模式之静态代理

版权声明:原创欢迎转载,转载请注明出处 https://blog.csdn.net/ye17186/article/details/88800400

代理(Proxy)是一种设计模式,是访问目标对象的另一种方式,在不改变目标对象的提前下,完成对目标对象的扩展。

这里用到了JAVA设计原则--开闭原则:对扩展开放,对修改关闭。

举个例子来说明代理的作用:假设我们需要邀请以为歌手来唱歌,我们并不需要直接去联系具体歌手,而是去联系该歌手的经纪人,来达到同样的目的。这里的歌手就是一个目标对象,他只负责唱歌,而其他的琐事,则有代理对象(经纪人)来完成。

代理模式的关键点:代理对象与目标对象,代理对象是对目标对象的扩展,代理对象会调用目标对象。

JAVA中有三种代理方式,下面一一解释。

一、静态代理

静态代理使用时,需要定义接口或者父类,目标对象和代理对象都要实现相同的接口或者继承相同的父类

以上述歌手、经纪人为例

1、共同的接口类Singer

/**
 * 某歌手接口
 *
 * @author ye17186
 * @version 2019/3/25 17:15
 */
public interface Singer {

    /**
     * 歌手提供唱歌服务
     */
    void sing();

}

2、目标对象--歌手SingerImpl

/**
 * 目标对象,歌手实现类,提供具体的唱歌服务
 *
 * @author ye17186
 * @version 2019/3/25 17:15
 */
public class SingerImpl implements Singer {

    @Override
    public void sing() {
        System.out.println("i am singing.");
    }

}

3、代理对象--经纪人SingerProxy

/**
 * 经纪人类,代理自己的歌手
 *
 * @author ye17186
 * @version 2019/3/25 17:18
 */
public class SingerProxy implements Singer{

    private Singer singer;

    // 代理自己的歌手
    public SingerProxy(Singer singer) {
        this.singer = singer;
    }

    @Override
    public void sing() {
        System.out.println("我是经纪人,我去安排歌手唱歌。");
        singer.sing();
        System.out.println("唱完了,请付款。");
    }
}

四、测试类

public class ProxyMain {

    public static void main(String[] args) {

        // 目标对象
        Singer singer = new SingerImpl();

        // 代理对象
        SingerProxy sp = new SingerProxy(singer);
        // 唱歌
        sp.sing();
    }
}

结果输出

静态代理总结

1、可以在不修改目标对象的前提下,对目标功能扩展

2、代理对象和目标对象需要实现一样的接口,所有会有很大代理类,类太多,一旦接口增加的方法,目标对象和代理对象都需要同步维护,也就是维护繁琐

如何解决静态代理中的问题,参考【JAVA设计模式】代理模式之动态代理

GitHub地址:https://github.com/ye17186/spring-boot-learn

猜你喜欢

转载自blog.csdn.net/ye17186/article/details/88800400