代理模式之静态代理

首先学习之前对其提出3个问题:

1.什么是代理模式?

2.一般用在什么场景?

3.怎么使用代理模式?

那我们围绕这3个问题进行一一的解答,首先是第一个问题,什么是代理模式,今天主要针对的是静态的代理模式:

那我们先讲一个故事,有一个哥们在外打拼多年,经过自己的努力,手里面相应的也有了一些积蓄,随着年龄的增长,打算找一个人度过一生,为了应付以后的丈母娘,所以就想着找一个相对好的房源,但是自己对此又不太了解,于是这个哥们就找了一个中介,并“委托”中介,让中介去找符合自己要求的房源,自己就等着中介的消息就行了,一旦觉得符合自己的预算,并且环境也好,位置也靠近地铁的话,那么核心的“交钱”就行了。

在这个过程中,有一个共同的主题:房子;代理者:中介;被代理者:这个“哥们”。

代理模式的三个要素:1.实现相同的接口。2.代理者(并且持有被代理者的引用)3.被代理者

第二个问题:一般用在什么场景?

我们希望的是我们的业务类只关注的业务的核心,而将容易改变的辅助的业务逻辑交给代理者来代理,实例:1.权限的验证;2.记录日志;3.计算程序运行的时间等

如 3在程序的开发阶段可能需要此功能,而在线上的部署的时候,或许就不在需要此功能;那么对于这种情况就可以使用代理模式代理。

第3个问题:怎么使用代理模式?

为了更好的理解代理模式的使用,就不在使用复杂是逻辑,以及减去对数据库的操作,需求如下:

在添加和删除元素之前,添加日志信息,代码如下:

接口:

/*
 * 数据操作访问接口:
 */
public interface Dao {
    void add();//添加
    void delte();//删除
}

被代理者类:

/*
 * 被代理者的类。
 * @author DHB
 *
 */
public class UserDao implements Dao {

    @Override
    public void add() {
        System.out.println("商品的添加...");
    }

    @Override
    public void delte() {
        System.out.println("商品的删除...");
    }

}

代理者

/**
 * 创建代理者的类:
 * 1.要持有被代理者的引用:将对象,通过构造器传进来。
 * @author DHB
 *
 */
public class ProxyDemo implements Dao {
    private UserDao userDao;
    public ProxyDemo(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void add() {
        //时常修改的代码:
        System.out.println("添加成功之前...");
        //核心的业务代码仍然需被代理者来写。
        userDao.add();
        System.out.println("添加成功结束");
    }
    @Override
    public void delte() {
        //时常修改的代码:
        System.out.println("删除成功之前...");
        //核心的业务代码仍然需被代理者来写。
        userDao.delte();
        System.out.println("删除成功之后...");
    }
}

测试代码:

public class AgentDemo {
    public static void main(String[] args) {
        ProxyDemo proxy = new ProxyDemo(new UserDao());
        proxy.add();
    }
}

使用代理模式的话,如果业务逻辑发生变化的话,那么主业务不需要更改,只需要改变代理者的代码就ok了。

那么我们不仅要问,静态代理是不是就是完美的哪?答案当然是否定的;原因是如果被代理的类只有一个的话,那使用静态的代理模式没问题,如果被代理的类有多个的话,那么就要写多个代理类,这样就会很麻烦,这显然不是我们想要的结果。

那么我们怎么解决哪?可以使用动态的代理。

注:动态的代理将在后续的篇文中展示,如果有需要的小伙伴,可以继续关注我哦 ~o~

 

posted @ 2018-06-19 09:31  路漫漫,随风~  阅读(218)  评论(0编辑  收藏  举报