分享一下设计模式的学习
1、什么是设计模式?
设计模式是在软件设计过程中,经过实践和总结得出的描述、解决软件设计问题的一种经验总结。它是一种被广泛接受和验证的最佳实践,用于解决特定类型的问题,并提供了可重用的解决方案。
设计模式提供了一种在特定情境下构建和组织代码的方式,以解决常见的设计问题。它们是根据软件设计原则和设计思想来定义的,可以帮助软件开发人员更好地理解和解决相似的设计问题。
设计模式的目标是提高软件设计的可复用性、可扩展性和易维护性。它们通过使用已经被验证的解决方案来减少重复的代码编写,并使软件设计更加灵活和可扩展。
设计模式可以分为以下几个类别:
- 创建型模式(Creational Patterns):用于处理对象的创建机制,包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和单例模式等。
- 结构型模式(Structural Patterns):用于处理对象之间的组合关系,包括适配器模式、代理模式、装饰器模式、组合模式和享元模式等。
- 行为型模式(Behavioral Patterns):用于处理对象之间的通信和职责分配,包括观察者模式、模板方法模式、策略模式、命令模式和迭代器模式等。
设计模式并不是一种固定的解决方案,而是一种灵活的指导原则。在使用设计模式时,需要根据具体的问题和需求进行选择和适配。设计模式的合理应用可以提高代码的重用性、可读性和可维护性,同时也促进了团队合作和软件开发的规范化。
2、创建型模式
工厂方法模式
它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴漏创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
Spring中的IOC,比如 beanFactory 接口,它有创建对象、配置对象、获取对象的能力,就是一种工厂模式的体现
Spring使用工厂模式编程,写一个工厂,由工厂创建Bean,以后我们如果要对象就直接管工厂要就可以,剩下的事情不归我们管了。Spring IOC容器的工厂中有个静态的Map集合,是为了让工厂符合单例设计模式,即每个对象只生产一次,生产出对象后就存入到Map集合中,保证了实例不会重复影响程序效率。
单例模式
单例模式就是指多次地进行获取对象,实际上是获取的同一对象。
单例模式的实现
- 枚举实现(推荐)
- 静态内部类(推荐)
- 双重锁校验
- 饿汉、懒汉式创建单例
3、结构型模式
代理模式
由代理对象去完成被代理对象的功能,并且可以有自己的扩展,Spring中的AOP
代理模式可以分为 静态代理、动态代理
不过动态代理是在编译器就确定的,比较不灵活。
Spring 中 AOP 的实现,也就是动态代理有两种实现:
JDK Proxy,它要求被代理对象实现了某个接口,它是通过反射动态创建了一个实现目标接口的代理类。
CGLib动态代理是通过继承目标类来实现的代理。它不需要目标类实现接口,而是直接继承目标类,并通过生成子类来进行代理。
CGLib通过生成目标类的子类,并重写父类中的方法来实现代理。子类的方法会拦截父类中的方法调用,并通过代理进行增强或处理。
相比较JDK动态代理,CGLib动态代理在创建代理对象的过程中没有使用反射,这样可以提高创建代理类的速度。在方法调用时,由于直接调用子类的方法,因此性能比JDK动态代理更高。
InvocationHandler、MethodInterceptor
4、行为型模式
模版模式
模板模式是一种行为设计模式,用于定义一个算法的框架,其中的具体步骤由子类实现。模板模式鼓励代码重用和提高可维护性。
在Spring框架中,也广泛使用了模板模式。以下是Spring中一些常见的使用模板模式的例子:
-
JdbcTemplate:JdbcTemplate是Spring提供的用于简化数据库访问的模板类。它定义了一系列操作数据库的模板方法,如查询、更新、执行SQL语句等,通过对这些模板方法的调用,开发者可以更方便地进行数据库操作。而具体的数据库访问细节则由JdbcTemplate的实现类去处理,如配置数据源、执行SQL语句等。
-
HibernateTemplate:类似于JdbcTemplate,HibernateTemplate是用于简化与Hibernate进行数据库交互的模板类。它封装了常用的Hibernate操作,如增删改查等,通过对这些模板方法的调用,可以更方便地进行数据库操作。
-
RestTemplate:RestTemplate是Spring提供的用于在客户端进行HTTP请求的模板类。它封装了HTTP请求的一些常用操作,如发送GET、POST、PUT、DELETE请求等,开发者可以通过调用这些模板方法来简化HTTP请求的编写工作。而具体的请求发送、响应处理等细节由RestTemplate的实现类去处理。
这些是Spring框架中常见的模板类,它们都使用了模板模式,通过定义模板方法来定义算法的框架和执行顺序,具体的步骤由子类或实现类去实现。这样的设计能够提高代码的重用性和可维护性,提供统一的接口进行操作,并将具体的实现细节进行封装,使得应用程序代码更加简洁和易于管理。
RedisTemplate是Spring Data Redis提供的模板类,用于简化与Redis进行交互的操作。它提供了一系列用于操作Redis的模板方法,如读写缓存、执行事务、发布订阅等。
通过RedisTemplate,我们可以方便地进行以下操作:
-
设置和获取键值对数据:RedisTemplate提供了操作字符串类型数据的方法,如
opsForValue().set(key, value)
用于设置键值对,opsForValue().get(key)
用于获取键对应的值。 -
操作Hash类型数据:RedisTemplate提供了操作Hash类型数据的方法,如
opsForHash().put(hashKey, key, value)
用于设置Hash数据,opsForHash().get(hashKey, key)
用于获取指定Hash数据的值。 -
执行事务:RedisTemplate支持事务操作,使用
execute
方法可以在一个事务中执行一系列操作,通过multi()
和exec()
方法来开始和提交事务。 -
发布订阅:RedisTemplate提供了发布和订阅消息的方法,使用
convertAndSend(channel, message)
方法可以向指定的频道发布消息,使用addMessageListener
方法可以添加消息监听器进行订阅。
除了以上的操作,RedisTemplate还提供了其他的操作方法,如操作列表、集合、有序集等。通过使用RedisTemplate,我们可以更方便地进行与Redis的交互,实现缓存、分布式锁、消息队列等功能。
要使用RedisTemplate,需要配置Redis连接池和连接工厂等相关配置,并将RedisTemplate注入到应用程序中。然后,就可以通过调用RedisTemplate的各种方法来操作Redis数据库。
java
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void setValue(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
public Object getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
上面的代码示例展示了使用RedisTemplate来设置和获取键值对数据的操作。通过自动注入RedisTemplate实例,我们可以直接调用opsForValue()方法来操作值类型的数据。
总结起来,RedisTemplate是Spring Data Redis提供的模板类,使用模板模式简化了与Redis交互的操作。通过提供一系列模板方法,开发者可以更方便地进行键值对操作、Hash操作、事务操作、发布订阅等一系列与Redis相关的操作。
未完待续。。。