IT评测·应用市场-qidao123.com技术社区

标题: MyBatis中使用的设计模式具体剖析 [打印本页]

作者: 去皮卡多    时间: 2024-8-31 00:35
标题: MyBatis中使用的设计模式具体剖析
一、单例模式

1. 使用位置


2. 设计原因


3. 功能实现


4. 简朴例子

想象一下一个“打印机”,只有一个打印机可以为整个公司打印文件。每个人都可以使用这个打印机,而不是每个人都买一个。
  1. public class SqlSessionFactorySingleton {
  2.     private static SqlSessionFactory instance; // 存储SqlSessionFactory的唯一实例
  3.     private SqlSessionFactorySingleton() {} // 私有构造函数,防止外部直接创建实例
  4.     public static SqlSessionFactory getInstance() {
  5.         if (instance == null) { // 如果实例不存在
  6.             synchronized (SqlSessionFactorySingleton.class) { // 加锁,确保线程安全
  7.                 if (instance == null) { // 再次检查实例
  8.                     instance = new SqlSessionFactoryBuilder().build(inputStream); // 创建实例
  9.                 }
  10.             }
  11.         }
  12.         return instance; // 返回单例实例
  13.     }
  14. }
复制代码

二、工厂模式

1. 使用位置


2. 设计原因


3. 功能实现


4. 简朴例子

想象你要买车,你不需要关心每个车的制造过程,只需要一个“车商”给你提供车就可以了。
  1. public interface SqlSessionFactory {
  2.     SqlSession openSession(); // 定义一个方法,用于创建SqlSession
  3. }
  4. public class DefaultSqlSessionFactory implements SqlSessionFactory {
  5.     @Override
  6.     public SqlSession openSession() {
  7.         return new DefaultSqlSession(); // 创建并返回DefaultSqlSession的实例
  8.     }
  9. }
复制代码

三、代理模式

1. 使用位置


2. 设计原因


3. 功能实现


4. 简朴例子

想象你有一个“秘书”,每当你需要做一件事时,秘书会帮你处置惩罚一些细节,比如安排时间和准备材料。
  1. public class MapperProxy<T> implements InvocationHandler {
  2.     private final SqlSession sqlSession; // 用于执行SQL的SqlSession实例
  3.     private final Class<T> mapperInterface; // Mapper接口的Class对象
  4.     public MapperProxy(SqlSession sqlSession, Class<T> mapperInterface) {
  5.         this.sqlSession = sqlSession; // 初始化SqlSession
  6.         this.mapperInterface = mapperInterface; // 初始化Mapper接口
  7.     }
  8.     @Override
  9.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  10.         // 生成SQL语句的ID,并调用SqlSession执行SQL
  11.         return sqlSession.selectOne(getStatement(method), args); // 执行SQL
  12.     }
  13.     private String getStatement(Method method) {
  14.         // 生成SQL语句ID,格式为"Mapper接口名.方法名"
  15.         return mapperInterface.getName() + "." + method.getName();
  16.     }
  17. }
复制代码

四、模板方法模式

1. 使用位置


2. 设计原因


3. 功能实现


4. 简朴例子

想象你有一个“食谱”,每次做饭时,你只需要按照食谱的步调去做,而不需要每次都重新想一遍。
  1. public class SqlSessionTemplate implements SqlSession {
  2.     private final SqlSessionFactory sqlSessionFactory; // SqlSessionFactory实例
  3.     // 构造函数,接受SqlSessionFactory作为参数
  4.     public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
  5.         this.sqlSessionFactory = sqlSessionFactory; // 初始化SqlSessionFactory
  6.     }
  7.     @Override
  8.     public <T> T selectOne(String statement, Object parameter) {
  9.         // 执行查询操作,返回单个结果
  10.         // 这里可以写具体的查询逻辑
  11.         return null; // 这里是示例,实际实现中会返回查询结果
  12.     }
  13.     // 其他数据库操作方法可以在这里实现
  14. }
复制代码

五、观察者模式

1. 使用位置


2. 设计原因


3. 功能实现


4. 简朴例子

想象一个“关照体系”,当一个人改变了他的接洽方式,所有相关的人都会收到关照,确保他们的信息是最新的。
观察者接口

  1. public interface Observer {
  2.     void update(String message); // 更新方法,接受通知
  3. }
复制代码
具体观察者(缓存)

  1. public class Cache implements Observer {
  2.     private String cacheData; // 缓存的数据
  3.     @Override
  4.     public void update(String message) {
  5.         // 当接收到更新通知时,清空缓存
  6.         System.out.println("Cache is being cleared due to: " + message);
  7.         cacheData = null; // 清空缓存
  8.     }
  9.     // 模拟更新缓存数据的方法
  10.     public void setCacheData(String data) {
  11.         this.cacheData = data;
  12.     }
  13.     public String getCacheData() {
  14.         return cacheData; // 返回缓存的数据
  15.     }
  16. }
复制代码
主题(数据库)

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Database {
  4.     private List<Observer> observers = new ArrayList<>(); // 存储观察者
  5.     // 添加观察者
  6.     public void addObserver(Observer observer) {
  7.         observers.add(observer);
  8.     }
  9.     // 移除观察者
  10.     public void removeObserver(Observer observer) {
  11.         observers.remove(observer);
  12.     }
  13.     // 更新数据库的方法
  14.     public void updateData(String newData) {
  15.         // 模拟数据更新
  16.         System.out.println("Database is updated with new data: " + newData);
  17.         notifyObservers("Data updated to: " + newData); // 通知所有观察者
  18.     }
  19.     // 通知所有观察者
  20.     private void notifyObservers(String message) {
  21.         for (Observer observer : observers) {
  22.             observer.update(message); // 调用观察者的更新方法
  23.         }
  24.     }
  25. }
复制代码
主程序

  1. public class Main {
  2.     public static void main(String[] args) {
  3.         Database database = new Database(); // 创建数据库实例
  4.         Cache cache = new Cache(); // 创建缓存实例
  5.         database.addObserver(cache); // 将缓存添加为观察者
  6.         // 模拟数据更新
  7.         database.updateData("New User Data"); // 更新数据库数据
  8.     }
  9. }
复制代码
6. 运行结果

当运行上面的代码时,会看到如下输出:
  1. Database is updated with new data: New User Data
  2. Cache is being cleared due to: Data updated to: New User Data
复制代码


六、策略模式

1. 使用位置


2. 设计原因


3. 功能实现


4. 简朴例子

想象你有一个“工具箱”,你可以根据需要选择不同的工具来完成特定的任务,比如锤子、螺丝刀等。


  1. public class MyPlugin implements Interceptor {
  2.     @Override
  3.     public Object intercept(Invocation invocation) throws Throwable {
  4.         // 在调用目标方法前,可以进行一些处理
  5.         System.out.println("Before executing: " + invocation.getMethod().getName());
  6.         // 调用原方法并返回结果
  7.         return invocation.proceed(); // 执行目标方法
  8.     }
  9.     @Override
  10.     public Object plugin(Object target) {
  11.         // 将目标对象包装成插件
  12.         return Plugin.wrap(target, this); // 返回插件对象
  13.     }
  14.     @Override
  15.     public void setProperties(Properties properties) {
  16.         // 设置插件的属性
  17.     }
  18. }
复制代码

七、总结



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4