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~

  • 相关阅读:
    windows下安装nginx
    java 32位MD5加密的大写字符串
    eclipse运行maven的jetty插件内存溢出
    Phpstorm Alt+Enter 自动导入类
    CSS 再学习,文本处理
    1406 data too long for column 'content' at row 1
    tp5.1报错 页面错误!请稍后再试
    lnmp升级php
    Tp5,Service使用
    CSS再学习 之背景色 背景图片
  • 原文地址:https://www.cnblogs.com/donghaibin/p/9196149.html
Copyright © 2011-2022 走看看