代理模式

2018-01-20  本文已影响0人  潜心之力

一、简介

定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
场景:远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。虚拟代理,这种方式通常用于要创建的目标对象开销很大时。安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。延迟加载,指为了提高系统的性能,延迟对目标的加载。

二、模式实现

以车票平台代理车票销售为例子

public interface Ticket { -> 抽象主题
    String name();
    Double price();
    void sale();
}

public class BusTicket implements Ticket { -> 真实主题
    @Override
    public String name() {
        return "汽车票";
    }

    @Override
    public Double price() {
        return 10.00;
    }

    @Override
    public void sale() {
        System.out.println(name() + ":" + price());
    }
}

public class TicketPlatform implements Ticket { -> 代理
    private Ticket ticket;

    public TicketPlatform(Ticket ticket) {
        this.ticket = ticket;
    }

    @Override
    public String name() {
        return ticket.name();
    }

    @Override
    public Double price() {
        return ticket.price();
    }

    public void sale() {
        ticket.sale();
    }
}

Ticket ticket = new BusTicket();
TicketPlatform platform = new TicketPlatform(ticket);
platform.sale();

三、JDK动态代理

public class DynamicPlatform implements InvocationHandler {
    private Object object;

    public DynamicPlatform(Object object){
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(object, args);
    }
}

Ticket ticket = new BusTicket();
DynamicPlatform platform = new DynamicPlatform(ticket);
ClassLoader loader = ticket.getClass().getClassLoader();
Ticket proxy = (Ticket) Proxy.newProxyInstance(loader,
        new Class[]{Ticket.class}, platform);
proxy.sale();
上一篇 下一篇

猜你喜欢

热点阅读