zoukankan      html  css  js  c++  java
  • 设计模式——代理模式

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

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

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

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

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

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

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

    首先定义卖票接口:

    /*
     * 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

  • 相关阅读:
    元素的定位问题
    报纸排版(分列示例)
    background的属性和背景图片定位的实例
    CSS选择器小结
    URL与图像格式
    MIME(Multipurpose Internet Mail Extensions)的简介
    介绍两种风格的URL
    门店销售讲究多
    软件项目中需求管理工作的重要性
    谈谈需求变更跟踪
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/6394528.html
Copyright © 2011-2022 走看看