Post

设计模式系列-代理模式

先讲静态代理模式,动态代理模式没太看懂….涉及到java的反射等语言特性,回头有时间再补吧

代理模式的主要角色如下。

抽象主题(Subject)类(业务接口类):通过接口或抽象类声明真实主题和代理对象实现的业务方法,服务端需要实现该方法。 真实主题(Real Subject)类(业务实现类):实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

静态代理

程序员事先创建好代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//业务接口
interface DateService {
    void add();
    void del();
}

class DateServiceImplA implements DateService {
    @Override
    public void add() {
        System.out.println("成功添加!");
    }

    @Override
    public void del() {
        System.out.println("成功删除!");
    }
}

class DateServiceProxy implements DateService {
    DateService server;

    public DateServiceProxy(DateService server) {
        this.server = server;
    }

    @Override
    public void add() {
        server.add();
        System.out.println("程序执行add方法,记录日志.");
    }
    @Override
    public void del() {
        server.del();
        System.out.println("程序执行del方法,记录日志.");
    }
}

//客户端
public class Test {
    public static void main(String[] args) {
        DateService service = new DateServiceProxy();
        service.add();
        service.del();
    }
}

这样可以在不改变程序原有代码的情况下,扩展了一些功能!同时一个代理就可以同时代理多个实现了同一个业务接口的业务,但这种方式必须要求客户端传入一个具体的实现类(这样客户就必须要获得具体目标对象实例,目标对象就直接暴露在访问对象面前了,对于某些情况这是不可接受的)

This post is licensed under CC BY 4.0 by the author.