美文网首页
代理模式(结构型)

代理模式(结构型)

作者: 游牧族人 | 来源:发表于2018-10-04 19:45 被阅读6次

定义:
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
代理对象可以代替目标对象实现目标对象的方法,同时可以对目标对象的方法进行增强处理。
三个角色:
抽象目标对象:目标对象的抽象表现形式。
具体目标对象:实现了抽象目标对象的具体目标对象。
代理目标对象:实现了抽象目标对象,同时作为具体目标的代理对象。

静态代理:

// 抽象行为
public interface Action
{
    void play();
    void work();
}
// 具体目标对象
public class Person implements Action
{
    @Override
    public void play()
    {
        System.out.println("开始游戏");
    }

    @Override
    public void work()
    {
        System.out.println("开始工作");
    }
}
// 代理目标对象
public class PersonProxy implements Action
{
    private Person person;

    public PersonProxy(Person person)
    {
        this.person = person;
    }

    @Override
    public void play()
    {
        System.out.println("play 拦截");
        person.play();
    }

    @Override
    public void work()
    {
        System.out.println("work 拦截");
        person.work();
    }
}
// 客户端
public class Client
{
    public static void main(String[] args)
    {
        Person person = new Person();
        PersonProxy personProxy = new PersonProxy(person);

        personProxy.play();
        personProxy.work();
    }
}
Output:
play 拦截
开始游戏
work 拦截
开始工作

动态代理:
在程序运行过程中通过反射机制动态创建代理类。

//  JDK 动态代理
public class Client{
    public static void main(String[] args){
        Action action = new Person();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) 
                    throws Throwable {
                if(method.getName().equals("play")){
                    System.out.println("play 拦截");
                }
                if(method.getName().equals("work")){
                    System.out.println("work 拦截");
                }

                Object o = method.invoke(action,args);
                return o;
            }
        };
        Action proxy = (Action) Proxy.newProxyInstance(
                action.getClass().getClassLoader(), 
                action.getClass().getInterfaces(),
                invocationHandler);

        proxy.play();
        proxy.work();
    }
}
Output:
play 拦截
开始游戏
work 拦截
开始工作

相关文章

  • Android进阶之光——设计模式(结构型设计模式)

    结构型设计模式 结构型设计模式是从程序的结构上解决模块之间的耦合问题 代理模式 代理模式也被称为委托模式。 定义:...

  • 【设计模式】结构型设计模式汇总

    结构型设计模式汇总 结构型设计模式名称 结构型设计模式主要包括 7 大类: 代理模式 桥接模式 装饰器模式 适配器...

  • Android设计模式——代理模式

    1.代理模式介绍 代理模式(Proxy Pattern),是七大结构型设计模式之一。 2.代理模式的定义 ...

  • 结构型模式

    简介 将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式。结构型模式分为:代理模式、适配器模式...

  • 14.代理模式(结构型)

    代理模式(结构型) 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个...

  • 设计模式-代理模式

    代理模式介绍 代理模式(Proxy Pattern)也称为委托模式,是结构型设计模式的一种。在现实生活中用到代理的...

  • 设计模式-代理模式

    1.代理模式的介绍 代理模式(Proxy Pattern)也称为委托模式,是结构型设计模式的一种。在我们生活中代理...

  • 设计模式之代理模式(Proxy Pattern)

    代理模式简介 代理模式(Proxy Pattern)是结构型模式,这种模式为其他对象提供一种代理以控制对这个对象的...

  • 代理模式(Proxy Pattern)

    1. 简介 代理模式属于设计模式中的结构型模式,有静态代理和动态代理两种实现方式。代理模式使用代理类来控制访问委托...

  • 设计模式(六)代理模式

    1.代理模式简介 代理模式介绍 代理模式也叫委托模式,是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场...

网友评论

      本文标题:代理模式(结构型)

      本文链接:https://www.haomeiwen.com/subject/ztbxaftx.html