Java代理模式之静态模式

在日常生活中也很多代理的现象,比如代购,想买一些港货,但自己又不想自己跑去香港购买,于是就是香港代购人,告诉他们要购买什么,事后给一点跑路费,就不用去香港就能买到自己要买的东西了。

在程序开发中,在一个无法修改类内部的结构,调用某个方法前后添加一些自己的业务逻辑,我们可以生成一个代理对象,通过代理对象去调用目标对象的这些方法,因为目标方法会被代理对象所调用,所以在调用的前后就可以做一些我们想要加入的业务逻辑。其实把代理理解为中间人。

Java代理模式之静态模式_第1张图片

代理模式的定义

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式的组成

  • 抽象角色 -> 通过接口或抽象类声明真实角色实现的业务方法。
  • 真实角色 -> 实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
  • 代理角色 -> 实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

代理模式的结构

从上面的代理结构图可知:一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象。

代理的优点

  • .职责清晰。真实角色就是实现实际的业务逻辑不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
  • 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
  • 高扩展性。

代理模式的分类

  • 静态代理

    静态代理就是代理类是由程序员自己编写的,在编译期就确定好了的。(在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。)

  • 动态代理

    动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

下面就实现一个静态代理例子

实现一个去香港代购的静态代理例子。
1、首先编写代理模式中目标对象的接口(抽象角色),并提供一个代购方法。

public interface HKShoppingService {
    void goShopping();//购物
}

2、代理模式中的目标对象(真正的实现角色)。定义一个HKShoppingService接口的实现类HKShoppingServiceImpl

public class HKShoppingServiceImpl implements HKShoppingService {
    @Override
    public void goShopping() {
        System.out.println("代购:香水、奶粉、化妆品!");
    }
}

3、定义代理类(代理角色)。

public class HKShoppingServiceProxy implements HKShoppingService {
    private HKShoppingService mTaget;
    public HKShoppingServiceProxy(HKShoppingService taget){
        mTaget=taget;
    }
    @Override
    public void goShopping() {
        System.out.println("去香港啦,需要代购的找我,准备出发啦!");
        mTaget.goShopping();
        System.out.println("刚从香港回来,代购的商品,准备发货,大家耐心等候!");
    }
}

4、测试类。

public class TestProxy {
    @Test
    public void testProxy() {
        //目标对象
        HKShoppingService taget = new HKShoppingServiceImpl();
        //代理对象
        HKShoppingServiceProxy proxy = new HKShoppingServiceProxy(taget);
        proxy.goShopping();
    }
}

这就是一个简单的静态的代理模式的实现。代理模式中的所有角色(代理对象、目标对象、目标对象的接口)等都是在编译期就确定好的。
静态代理还是存在一些局限性的,比如使用静态代理模式需要程序员手写很多代码,这个过程是比较浪费时间和精力的。一旦需要代理的类中方法比较多,或者需要同时代理多个对象的时候,这无疑会增加很大的复杂度。有没有一种方法,可以不需要程序员自己手写代理类呢。这就是动态代理啦。关于动态代理下一章节介绍。

总结

  • 静态代理的用途 控制真实对象的访问权限 通过代理对象控制对真实对象的使用权限。
  • 避免创建大对象 通过使用一个代理小对象来代表一个真实的大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
  • 增强真实对象的功能 这个比较简单,通过代理可以在调用真实对象的方法的前后增加额外功能。

你可能感兴趣的:(Java代理模式之静态模式)