JAVA设计模式--代理模式(静态)

文章中部分经典内容参考以下博文:
http://www.lxway.com/4445954962.htm
http://blog.csdn.net/lovelion/article/details/8116704
https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/

一、什么是代理模式

 代理(Proxy)模式为其他对象提供一种代理以控制对这个对象的访问。(原文:The Proxy Pattern Provide a surrogate or placeholder for another object to control access to it.)

代理模式的作用:在客户端和被代理对象之间起到中介作用,通过代理可以有效地控制客户端对被代理对象的直接访问,进而可以很好地隐藏和保护被代理对象。

代理模式按照其代理类生成方式的不同又可以分为静态代理和动态代理两种,本章先跟大家来聊聊静态代理。


二、静态代理模式的结构

 代理模式是一种结构型设计模式,在代理模式中,代理与被代理的对象通常要实现相同的接口,以便在需要的时候可以使用代理来替代被代理对象,客户端必须通过代理与被代理对象进行交互,并且可以在交互的过程中(交互前后)添加一些额外的功能。
静态代理模式的UML结构示意图如下。

 静态代理模式涉及的角色及其职责:
抽象主题(Subject)角色:这是一个抽象角色,通常被定义为接口,真实主题角色和代理主题角色都需实现此接口,以便将来可以使用代理主题对象来替代真实主题对象。

真实主题(RealSubject)角色:也叫被代理角色,是代理主题角色所代表的真实对象,是业务逻辑的实际执行者。

代理主题(Proxy)角色:也叫代理角色,该角色内部含有对真实主题对象的引用,从而可以操作真实主题对象,同时代理对象提供与真实主题对象相同的接口以便在任何时刻都能代替真实主题对象。通常代理角色会在将客户端调用传递给真实主题对象之前或者之后执行某些操作,而不是单纯地将调用传递给真实主题对象。

静态代理模式结构示意源代码如下:

 抽象主题(Subject)角色
 public interface Subject {
    // 声明真实主题角色和代理主题角色都需实现的方法
    public void operation();
}

真实主题(RealSubject)角色
public class RealSubject implements Subject {
    //实现了抽象主题角色定义的接口
    @Override
    public void operation() {
        System.out.println("调用真实主题对象执行操作进行中...");
    }
}

代理主题(Proxy)角色
public class Proxy implements Subject {
    //包含一个真实主题对象的引用
    private Subject realSubject;
    public Proxy(Subject realSubject) {
        this.realSubject = realSubject;
    }
    public void before() {
        System.out.println("调用真实主题对象之前进行的相关操作...");
    }
    public void after() {
        System.out.println("调用真实主题对象之后进行的相关操作...");
    }
    //通过调用内部真实主题对象的引用实现了抽象主题角色定义的接口,并添加了一些额外处理功能
    @Override
    public void operation() {
        before();
        realSubject.operation();
        after();
    }
}

在客户端中测一下:
public class Client{
    public static void main(String[] args) {
        Subject realSubject=new RealSubject(); 
        Proxy proxy= new Proxy(realSubject);
        proxy.operation();
    }
}
运行程序打印结果如下:
调用真实主题对象之前进行的相关操作...
调用真实主题对象执行操作进行中...
调用真实主题对象之后进行的相关操作...

从上面的例子可以看出代理对象将客户端的调用委派给被代理对象,并在调用被代理对象的方法之前和之后执行了一些特殊操作,此种模式与装饰模式有点相似,两者的区别在于:代理模式的目的在于控制访问,装饰模式的目的在于添加功能。

PS:不理解代理模式与装饰模式之间区别?没关系,待我们讲完接下来数据库连接池的例子,相信你一定会有所领悟。

原文:https://blog.csdn.net/pengjunlee/article/details/51841599 

猜你喜欢

转载自blog.csdn.net/jiangtianjiao/article/details/87939278