• 23种设计模式,代理模式


    一,代理模式

      为什么要学习代理模式?因为这就是SpringAOP的底层!【Spring AOP 和SpringMVC】

      代理模式分类:

        静态代理

        动态代理

    那到底什么是代理模式呢?

      看图!

    最佳理解(优点恶趣味):上图的关系可以这么理解(mybatis就是房东,servioce就是中介,controller就是客户

                通俗点也可以看作是 入土,代理帮你火化

                  

    1.2静态代理

      角色分析:

        抽象角色:一般会使用接口或抽象类来解决(相当于图上的租房,即 真实角色和代理共同想做的事情)

        真实角色:被代理角色(真正想做事的人)

        代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作

        客户:访问代理对象的人 

    代码步骤

       1,接口(抽象角色)

    //租房
    public interface Rent {
    
        public void rent();
    
    }

      

      2,真实角色

    //房东
    public class Host implements Rent{
    
        public void rent() {
            System.out.println("房东要出租房子!");
        }
    }

      3,代理角色

    package com.king.demo01;
    
    public class Proxy implements Rent{
    
        private Host host;
    
        public Proxy() {
        }
    
        public Proxy(Host host) {
            this.host = host;
        }
    
        public void rent() {
            seeHouse();
            host.rent();
            hetong();
            fare();
        }
    
        //看房
        public void seeHouse(){
    
            System.out.println("中介带你看房");
        }
    
        //合同
        public void hetong(){
            System.out.println("签合同");
        }
    
        //收中介费
        public void fare(){
            System.out.println("收中介费");
        }
    
    }

      4,客户

    package com.king.demo01;
    
    //客户
    public class Client {
        public static void main(String[] args) {
            Host host = new Host();
    
            //代理
            Proxy proxy = new Proxy(host);
            proxy.rent();
        }
    }

      代理模式的好处:

        可以使真实角色的操作更加纯粹!,不用关注一些公共业务!

        公共的业务交给代理角色干!,实现了业务分工!

        公共业务发生扩展的时候,方便集中管理!

      缺点

        一个真实角色只会产生一个代理角色,代码量会翻倍,开发效率会变低

    1.3,静态代理模式加深理解  

      接口(抽象角色)

    package com.king.demo02;
    
    public interface UserService {
        public void add();
        public void delete();
        public void update();
        public void query();
    
    }

      

      真实角色

    package com.king.demo02;
    
    //真实对象
    public class UserServiceImpl implements UserService {
        public void add() {
    
            System.out.println("增加一个用户");
        }
    
        public void delete() {
            System.out.println("删除一个用户");
        }
    
        public void update() {
            System.out.println("修改一个用户");
        }
    
        public void query() {
            System.out.println("查询一个用户");
        }
    }

      代理角色

    package com.king.demo02;
    
    public class userServiceProxy implements UserService {
        private UserServiceImpl userService;
    
        //通过setter进行属性注入符合Spring的ioc实现方法DI的底层
        public void setUserService(UserServiceImpl userService) {
            this.userService = userService;
        }
    
        public void log(String msg){
            System.out.println("使用了"+msg+"方法");
        }
    
        public void add() {
            log("add");
            userService.add();
        }
    
        public void delete() {
            log("del");
            userService.delete();
        }
    
        public void update() {
            log("update");
            userService.update();
        }
    
        public void query() {
            log("query");
            userService.query();
        }
    }

      客户

    package com.king.demo02;
    
    //客户
    public class Client {
        public static void main(String[] args) {
            UserServiceImpl userService = new UserServiceImpl();
            //先走无参创建对象
            userServiceProxy proxy = new userServiceProxy();
            //再通过set方法,实现属性注入,当然有参也能实现,原因:符合Spring依赖注入的方式
            proxy.setUserService(userService);
    
            proxy.add();
    
        }
    }

    小结:使用代理模式的目的就是为了保证业务层代码保持不变,可变性强的操作,再代理层实现

    二,动态代理模式

      1,动态代理和静态代理的角色一样

      2,动态代理的代理类是动态生成的,不是我们直接写好的!

      3,动态代理的实现分为两大类:基于接口的动态代理,基于类的动态代理

        基于接口-----JDK动态代理【在这里使用这个】

        基于类:cglib

        java字节码实现:javasist

        

      需要了解两个类:Poxy,代理    InvocationHandler,调用处理程序  

     

  • 相关阅读:
    requirejs
    fontresize 移动端的手机字体 大小设置
    css 设置字体
    nodejs javascript微信开发
    多个倒计时
    pure.css 学习记录
    【转】JMeter学习(五)检查点(断言)
    【转】JMeter学习(四)参数化
    【转】JMeter学习(三)元件的作用域与执行顺序
    [转]JMeter学习(二)录制脚本
  • 原文地址:https://www.cnblogs.com/CL-King/p/13916396.html
Copyright © 2020-2023  润新知