05-静态代理模式

参考资料1:http://c.biancheng.net/design_pattern/

参考资料2:https://refactoringguru.cn/design-patterns/catalog

Java静态代理设计模式

代理模式是Java常见的设计模式之一。
代理模式是指不直接调用实际对象,而是通过调用代理,来间接的调用实际的对象。

为什么要采用这种间接的形式来调用对象呢?
场景①:不想直接访问实际的对象;
场景②:对实际的对象的访问存在困难
场景③:有需求需要将封装对象访问/操作的成员方法进行逻辑增强,而不修改原方法
在现实生活中,这种情形非常的常见,比如请一个律师代理来打官司

代理模式可以有 2 种实现的方式:
一种是静态代理,另一种是各大框架都喜欢的动态代理
还有一种类似静态代理的装饰者模式

现有 User 实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class User {
private int id; // 编号属性 id
private String name; // 姓名属性 name
public User() { }
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@Override
public String toString() {
return "User{" + "id=" + id + ", name='" + name + '\'' + '}';
}
}

DAO封装数据访问思想:用来封装对实体类 User 类的访问/操作。
UserDao 接口:

1
2
3
4
5
6
public interface UserDao {
void add();
void delete();
void update();
void select();
}

UserDaoImpl 实现类:

1
2
3
4
5
6
7
8
9
10
public class UserDaoImpl implements UserDao {
@Override
public void add() { System.out.println("add"); }
@Override
public void delete() { System.out.println("delete"); }
@Override
public void update() { System.out.println("update"); }
@Override
public void select() { System.out.println("select"); }
}

需求:通过 静态代理、装饰者、动态代理模式分别 增强 add() 方法的逻辑功能

1.1 实现步骤

① 自定义一个代理类(增强类)实现和被代理类(被增强类)相同的接口
② 在代理类中声明被代理类的对象
③ 在代理类的方法中使用被代理类调用方法

1.2 逻辑图 & 源码示例

顶部。

代理类(该类 UserDaoProxy)、被代理类(UserDaoImpl):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 静态代理设计模式
*/
// 1.实现和被代理类相同的接口
public class UserDaoProxy implements UserDao {
// 2.在代理类中声明被代理类的引用
private UserDao userDao;
public UserDaoProxy() {
userDao = new UserDaoImpl();
}
// 3.在代理类的方法中使用被代理类调用方法
@Override
public void add() {
System.out.println("权限校验");
userDao.add();
System.out.println("日志记录");
}
@Override
public void delete() { userDao.delete(); }
@Override
public void update() { userDao.update(); }
@Override
public void select() { userDao.select(); }
}

测试静态代理类;

1
2
3
4
5
6
7
public class TestProxy {
public static void main(String[] args) {
// 测试静态代理模式
UserDaoProxy userDaoProxy = new UserDaoProxy();
userDaoProxy.add();
userDaoProxy.delete();
}

运行结果:
Java静态代理设计模式

1.3 静态代理 - 优缺

优点:不修改源码增强被代理类的功能,可以控制被代理类的对象
缺点:必须要重写被代理类接口的所有的方法,耦合性高


05-静态代理模式
https://janycode.github.io/2018/04/28/10_设计模式/05-静态代理模式/
作者
Jerry(姜源)
发布于
2018年4月28日
许可协议