参考资料1:http://c.biancheng.net/design_pattern/
参考资料2:https://refactoringguru.cn/design-patterns/catalog
现有 User 实体类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class User { private int id; private String 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 逻辑图 & 源码示例
顶部。
装饰类(该类 UserDaoWrapper)、被装饰类(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 25
|
public class UserDaoWrapper implements UserDao { private UserDao userDao; public UserDaoWrapper() { } public UserDaoWrapper(UserDao userDao) { this.userDao = userDao; } @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) { UserDaoWrapper userDaoWrapper = new UserDaoWrapper(new UserDaoImpl()); userDaoWrapper.add(); userDaoWrapper.delete(); }
|
运行结果:
1.3 装饰者模式 - 优缺
优点:不修改源码增强
被代理类的功能,无法控制
被代理类的对象
缺点:必须要重写被代理类接口的所有的方法,耦合性高