设计模式——代理模式

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

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

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

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

 

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

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

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

首先定义卖票接口:

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

posted @ 2017-02-13 16:53  沙中世界  阅读(193)  评论(0编辑  收藏  举报