zoukankan      html  css  js  c++  java
  • 代理模式之静态代理

    首先学习之前对其提出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~

  • 相关阅读:
    1055. [HAOI2008]玩具取名【区间DP】
    BZOJ2435:[NOI2011]道路修建 (差分)
    1084. [SCOI2005]最大子矩阵【网格DP】
    1060. [ZJOI2007]时态同步【树形DP】
    1050. [HAOI2006]旅行【并查集+枚举】
    2463. [中山市选2009]谁能赢呢?【博弈论】
    luogu P1195 口袋的天空
    luogu P1162 填涂颜色
    luogu P1223 排队接水
    luogu P1331 海战
  • 原文地址:https://www.cnblogs.com/donghaibin/p/9196149.html
Copyright © 2011-2022 走看看