• 设计模式——代理模式


    代理模式应用场景一般是控制对象的访问权限,有时用于为对象增加功能。

    与装饰模式的区别是,装饰模式增加的功能一般是特殊功能,而代理模式增加的功能是通用功能;同时,在实现上,一般代理模式中,被代理对象是在代理对象中创建的,而装饰模式中被装饰对象是通过构造函数从外部传入到装饰者中的。

    装饰模式一般使用抽象类继承实现对被装饰者的调用。代理模式使用的是被代理类作为代理类的成员。

    代理模式分为:远程代理、保护代理(主要用于控制被代理对象的访问权限),虚拟代理(用于延迟对象的创建),装饰代理(添加通用的功能)

    通常也将代理模式分为静态代理和动态代理;

    静态代理一般是一对一代理,一个代理对象对应一个委托类(被代理对象)

     下面看代码,以黄牛代理卖票为例:

    首先定义卖票接口:

    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.Proxy;
    
    /**
     * @description
     * @author panteng
     * @date 17-2-13.
     */
    public interface SellTicket {
        void sellTicket();
    }
    SellTicket

    定义车站(实际卖票处,需要实现卖票接口)

    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.Proxy;
    
    /**
     * @description
     * @author panteng
     * @date 17-2-13.
     */
    public class BusStation implements SellTicket {
        public void sellTicket(){
            System.out.println("出一张票");
        }
    
        public void sellStudentTicket(){
            System.out.println("出售一张学生票");
        }
    
        public void sellChildrenTicket(){
            System.out.println("出售一张儿童票");
        }
    }
    BusStation

    定义黄牛(代理类,需要实现卖票接口)

    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.Proxy;
    
    /**
     * @description
     * @author panteng
     * @date 17-2-13.
     */
    public class ScalpersProxy implements SellTicket {
        BusStation busStation;
    
        ScalpersProxy(){
            busStation = new BusStation();
        }
    
        public void sellTicket(){
            busStation.sellTicket();
            System.out.println("加价");
        }
    
        public void sellTicket(String type){
            if ("儿童".equals(type)) {
                busStation.sellChildrenTicket();
                System.out.println("加一点价");
            } else if ("学生".equals(type)) {
                busStation.sellStudentTicket();
                System.out.println("加多一点价");
            } else {
                this.sellTicket();
            }
        }
    }
    ScalpersProxy
    /*
     * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
     */
    
    package com.pt.Proxy;
    
    import org.junit.Test;
    
    /**
     * @description
     * @author panteng
     * @date 17-2-13.
     */
    public class ScalpersProxyTest {
        @Test
        public void proxyTest(){
            ScalpersProxy proxy = new ScalpersProxy();
            proxy.sellTicket();
            proxy.sellTicket("儿童");
        }
    }
    测试

    对于通用框架一般使用动态代理,为委托类增加通用功能!

    Java动态代理相关文章之前已有总结:

    http://www.cnblogs.com/tengpan-cn/p/4841033.html

  • 相关阅读:
    ABP 开发(一)
    转发: Angular装饰器
    AJAX上传文件到服务器
    转:system.Security.Cryptography C# 加密和解密
    asp.net mvc5 step by step(四)——关于Controller的ActionResult
    asp.net mvc5 step by step(三)—— Entity Framework Database First
    asp.net mvc5 step by step(二)——Data Annotations(data 注释)
    项目中使用protobuf
    架构私用Nuget服务器
    dockerfile语法
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/6394528.html
Copyright © 2020-2023  润新知