zoukankan      html  css  js  c++  java
  • JAVA设计模式——代理(静态代理)

    定义

    为其它的对象提供一种代理,以控制这个对象的访问

    使用场景

    当不想直接访问某个对象的时候,就可以通过代理

    1.不想买午餐,同事帮忙带 
    2.买车不用去厂里,去4s店 
    3.去代理点买火车票,不用去车站

    UML

    介绍下上面的UML图的意思,以购买火车票为例:

    定义代理的接口,买票

    1)IProxy


    代理的对象,完成代理的任务,设置具体的代理,调用具体的代理方法等

    2)ProxyObject

    被代理对象,处理具体的业务逻辑

    3)RealObject

    代码实现

    上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

    (1)定义代理接口

    package com.zengtao.demo.proxy;
    
    public interface IProxy {
    
        void buyTicket();
    
    }

    (2)代理类

    package com.zengtao.demo.proxy;
    
    /**
     * 代理
     */
    public class Proxy implements IProxy {
    
        private RealProxy realClient;
    
        public Proxy(RealProxy realClient) {
            this.realClient = realClient;
        }
    
        @Override
        public void buyTicket() {
         //befer 处理其他逻辑 realClient.buyTicket();
         //after 处理其他逻辑 } }

    (3)被代理对象买票

    package com.zengtao.demo.proxy;
    
    import com.zengtao.demo.bean.User;
    
    /**
     * 具体代理买票
     */
    public class RealProxy implements IProxy {
    
        private User user;
    
        public RealProxy() {
    
        }
    
        public RealProxy(User user) {
            this.user = user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        @Override
        public void buyTicket() {
            // 具体实现逻辑
            if (user != null) {
                System.out.println("***********我要买票***********");
                System.out.println("信息如下:");
                System.out.println("姓名:" + user.getName());
                System.out.println("性别:" + user.getSex());
                System.out.println("身份证号:" + user.getCardCode());
                System.out.println("住址:" + user.getHomeAddress());
    
                System.out.println("***********信息已核对***********");
                System.out.println("出票成功:动车D2222次09车20A");
            }
        }
    }

    (4)用户对象

    package com.zengtao.demo.bean;
    
    import java.io.Serializable;
    
    @SuppressWarnings("serial")
    public class User implements Serializable {
    
        private String cardCode;
        private String name;
        private String homeAddress;
        private String sex;
    
        public String getCardCode() {
            return cardCode;
        }
    
        public void setCardCode(String cardCode) {
            this.cardCode = cardCode;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getHomeAddress() {
            return homeAddress;
        }
    
        public void setHomeAddress(String homeAddress) {
            this.homeAddress = homeAddress;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    }

    (6)具体调用

    package com.zengtao.demo;
    
    import com.zengtao.demo.bean.User;
    import com.zengtao.demo.proxy.Proxy;
    import com.zengtao.demo.proxy.RealProxy;
    
    public class Main {
    
        public static void main(String[] str) {
            // 用户信息
            User user = new User();
            user.setCardCode("510522177709096836");
            user.setSex("男");
            user.setName("无名氏");
            user.setHomeAddress("地球村第七号店铺");
    
            // 具体代理
            RealProxy realClient = new RealProxy();
            realClient.setUser(user);
    
            // 代理
            Proxy proxy = new Proxy(realClient);
            proxy.buyTicket();
        }
    }

    (7)结果

    这里写图片描述

    以上以代理模式的方式,简陋的实现了购票的流程。

    总结

      大家也可以看到,其实代理模式,说白了就是委托,将所有的事情都委托给别人帮你完成,你所要做的,就是给代理一些东西,接下来所有的事情都是代理帮你完成,你完全不用去关心内部是如何实现的。

    代理模式:一般可以分为两种,一种为静态代理,一种为动态代理

    (1)静态代理

    静态代理:就是我们上述所写的,代理代码是由我们自己去生成的固定的代码进行编译

    (2)动态代理

    动态代理:动态代理,跟静态代理相反,它是用反射机制动态的生成代理的对象,我们不需要知道谁代理谁

    传送门:JAVA设计模式——代理(静态代理)

  • 相关阅读:
    计算机网络 学习笔记-传输层:TCP协议简介
    C/C++里的const(2)
    C语言变量声明加冒号的用法
    CTL_CODE说明
    FreeImage.lib库的配置和简单使用 转
    WSASocket()与Socket()的区别 转
    Win7下运行VC程序UAC权限问题 VC2010设置UAC权限方法
    MFC通过URL下载并保存文件代码 转载
    opencv 数据类型转换:CvArr, Mat, CvMat, IplImage, BYTE 转
    ISIS Scanner Errors codes
  • 原文地址:https://www.cnblogs.com/TvvT-kevin/p/9879732.html
Copyright © 2011-2022 走看看