zoukankan      html  css  js  c++  java
  • 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,调用处理程序  

     

  • 相关阅读:
    SAP OPEN UI5 Step 8: Translatable Texts
    SAP OPEN UI5 Step7 JSON Model
    SAP OPEN UI5 Step6 Modules
    SAP OPEN UI5 Step5 Controllers
    SAP OPEN UI5 Step4 Xml View
    SAP OPEN UI5 Step3 Controls
    SAP OPEN UI5 Step2 Bootstrap
    SAP OPEN UI5 Step1 环境安装和hello world
    2021php最新composer的使用攻略
    Php使用gzdeflate和ZLIB_ENCODING_DEFLATE结果gzinflate报data error
  • 原文地址:https://www.cnblogs.com/CL-King/p/13916396.html
Copyright © 2011-2022 走看看