解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!

这篇具有很好参考价值的文章主要介绍了解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

桥接模式

桥接模式也称为桥梁模式、接口模式或者柄体(Handle and Body)模式,是将抽象部分与他的具体实现部分分离,使它们都可以独立地变化,通过组合的方式建立两个类之间的联系,而不是继承。

桥接模式是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过使用组合而不是继承的方式,可以更灵活地组织和管理代码。

结构:

  • 抽象部分(Abstraction):定义抽象类或接口,并维护一个指向实现部分的引用。
  • 扩充抽象类(Refined Abstraction):扩展抽象部分,可以添加更多的功能。
  • 实现部分(Implementor):定义实现类接口,供抽象部分调用。
  • 具体实现类(Concrete Implementor):实现实现部分的接口,提供具体的功能实现

优点:

  1. 解耦合:桥接模式能够将抽象部分和实现部分分离,使它们可以独立地进行变化。这种解耦合使得系统更加灵活和可维护。
  2. 扩展性:由于桥接模式采用了组合的方式而不是继承,因此更容易扩展和变化。新的抽象部分和实现部分可以独立地添加和修改,而不会对现有的代码产生影响。
  3. 隐藏实现细节:桥接模式可以隐藏实现的细节,使客户端代码只关注于抽象部分,而不需要关心具体的实现细节。这种隐藏可以减少系统中的耦合度,提高代码的可维护性和可理解性。
  4. 适应变化:桥接模式使得系统更加灵活和适应变化。通过抽象部分和实现部分的分离,系统可以更容易地应对需求的变化和新的功能的添加。

缺点:

  1. 增加复杂性:桥接模式引入了抽象部分和实现部分之间的桥梁,可能会增加系统的复杂性。特别是对于简单的系统,使用桥接模式可能会显得过于复杂。
  2. 理解成本:由于桥接模式涉及到多个类和接口之间的关系,可能会增加新成员对系统的理解成本。需要仔细地理解抽象部分和实现部分之间的关系,以及桥接模式的设计思想。
  3. 过度设计:在某些情况下,使用桥接模式可能会导致过度设计的问题。如果系统的抽象部分和实现部分之间的关系比较简单,使用桥接模式可能会显得不够自然和合适。
  4. 设计复用性:虽然桥接模式提高了系统的灵活性和扩展性,但如果不恰当地使用,可能会导致设计复用性下降。过度使用桥接模式可能会导致代码结构的过度抽象,使得代码变得难以理解和维护。

注意事项

  • 桥接模式适用于系统中多个维度的变化。
  • 避免过度设计,只有当两个维度中的一个或两个具有多个实现时才考虑使用桥接模式。

适用场景

  • 系统有多个维度同时变化,且不希望使用多层继承。
  • 想要在抽象和实现之间建立一个稳定的联系,但又不希望二者紧密耦合。

1.案例1-发送通知

需求

假设我们正在开发一个电商平台,该平台需要发送不同类型的通知给用户,例如电子邮件通知、短信通知、App推送通知等。同时,用户可能也有不同的偏好和设备,例如有些用户更喜欢通过邮件接收通知,而另一些用户则更倾向于使用手机App接收通知。

实现思路

  1. 通知接口(Notification):定义了发送通知的方法。
  2. 具体通知类(ConcreteNotification):实现了通知接口的具体通知类型,如邮件通知、短信通知、App推送通知等。
  3. 用户偏好(UserPreference):定义了用户的通知偏好,包含具体通知类,例如用户更喜欢接收邮件通知还是App推送通知。
  4. 用户类(User)包含用户的信息和偏好设置
  5. 通知服务类(NotificationService):负责根据用户的偏好选择合适的通知方式进行发送。(包含用户信息

解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!,Spring设计模式,spring boot,设计模式,桥接模式

1.1.通知接口
/**
 * 通知接口
 * @author 13723
 * @version 1.0
 * 2024/2/7 10:17
 */
public interface Notification {
	/**
	 * 通知
	 * @param message 通知消息
	 */
	void notify(String message);
}
1.1.2.具体通知类-APP
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

/**
 * APP通知类
 * @author 13723
 * @version 1.0
 * 2024/2/7 10:19
 */
public class APPNotification implements Notification{
	private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

	/**
	 * APP通知
	 * @param message 通知消息
	 */
	@Override
	public void notify(String message) {
		logger.error("【APP通知】: {}", message);
	}
}

1.1.3.具体通知类-短信
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

/**
 * 邮箱通知类
 * @author 13723
 * @version 1.0
 * 2024/2/7 10:21
 */
public class EMailNotification implements Notification{
	private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

	/**
	 * 邮箱通知
	 * @param message 通知消息
	 */
	@Override
	public void notify(String message) {
		logger.error("【邮件通知】: {}", message);
	}
}

1.1.4.具体通知类-邮箱
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

/**
 * 邮箱通知类
 * @author 13723
 * @version 1.0
 * 2024/2/7 10:21
 */
public class EMailNotification implements Notification{
	private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

	/**
	 * 邮箱通知
	 * @param message 通知消息
	 */
	@Override
	public void notify(String message) {
		logger.error("【邮件通知】: {}", message);
	}
}

1.1.5.用户偏好类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

/**
 * 用户偏好类
 * @author 13723
 * @version 1.0
 * 2024/2/7 10:23
 */
public class UserPreference {
	private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
	/**
	 * 此处引入通知接口,实现桥接模式,将通知接口和用户偏好类解耦
	 */
	private Notification notification;

	/**
	 * 用户偏好
	 * @param notification 通知
	 */
	public UserPreference(Notification notification) {
		this.notification = notification;
	}

	public Notification getNotification() {
		return notification;
	}
}
1.1.6.用户类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

/**
 * 用户类
 * @author 13723
 * @version 1.0
 * 2024/2/7 10:26
 */
public class User {
	private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
	/**
	 * 用户名称
	 */
	private String name;

	/**
	 * 用户偏好
	 */
	private UserPreference userPreference;

	public User(String name, UserPreference userPreference) {
		this.name = name;
		this.userPreference = userPreference;
	}

	protected void receiveNotification(String message) {
		message = name + ":" + message;
		userPreference.getNotification().notify(message);
	}

}
1.1.7.服务通知类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

/**
 * @author 13723
 * @version 1.0
 * 2024/2/7 10:37
 */
public class NotificationService {
	private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());


	/**
	 * 发送通知
	 * @param user 用户,用户里面已经设置好偏好通知了,偏好通知里面已经设置好具体的通知方式了
	 * @param message 通知消息
	 */
	public void sendNotification(User user, String message) {
		user.receiveNotification(message);
	}
}

1.1.8.测试类
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.invoke.MethodHandles;

/**
 * 测试 桥梁模式-通知用户
 * @author 13723
 * @version 1.0
 * 2024/2/7 10:42
 */
public class NotificationTest {
	private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());


	@Test
	@DisplayName("测试通知用户")
	public void testNotification() {
		// 设置通知方式
		APPNotification appNotification = new APPNotification();
		SMSNotification smsNotification = new SMSNotification();

		// 设置用户偏好
		UserPreference zs = new UserPreference(appNotification);
		UserPreference ls = new UserPreference(smsNotification);

		// 设置用户
		User user1 = new User("张三", zs);
		User user2 = new User("李四", ls);



		// 通知服务
		NotificationService notificationService = new NotificationService();

		notificationService.sendNotification(user1, "你好,你的账号被人盗走了!请联系客户找回,85852555!");
		notificationService.sendNotification(user2, "你好,你的账号被人盗走了!请联系客户找回,85852555!");


	}
}

解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!,Spring设计模式,spring boot,设计模式,桥接模式

2.Spring代码-JdbcTemplate

2.1.案例

@SpringBootTest
public class BridgeTest {
	private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

	@Test
	@DisplayName("测试template")
	public void test(){
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName("org.postgresql.Driver");
		dataSource.setUrl("jdbc:postgresql://192.168.1.56/postgres?currentSchema=gwstd");
		dataSource.setUsername("postgres");
		dataSource.setPassword("152564.lmy");
		JdbcTemplate jdbcTemplate = new JdbcTemplate();
		jdbcTemplate.setDataSource(dataSource);
		String sql = "select * from t_dec_order_head limit 1";
		List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
		for (Map<String, Object> map : maps) {
			logger.error("result:{}",map);
		}
	}
}

解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!,Spring设计模式,spring boot,设计模式,桥接模式

JdbcTemplate 使用了桥接模式来实现数据库操作的抽象和实现的解耦合。这种模式使得应用程序能够专注于高级的业务逻辑,而不必关心底层数据库访问的细节。

JdbcTemplate 使用了以下几个关键角色:

  1. 抽象部分(Abstraction)
    • JdbcTemplate 中,抽象部分代表了对数据库操作的抽象接口,例如 JdbcTemplate 类本身以及它的一些方法,如 query()update() 等。
    • 这些方法定义了客户端与数据库交互的高级操作,比如查询数据、更新数据等。
  2. 扩充抽象类(Refined Abstraction)
    • 在 JdbcTemplate 中,扩充抽象部分是对抽象部分的扩展,可以添加更多的功能或者调整现有的功能。
    • 例如,你可以创建自定义的 JdbcTemplate 子类,通过添加新的方法或者重写现有方法来实现更具体的数据库操作。
  3. 实现部分(Implementor)
    • JdbcTemplate 中,实现部分代表了对底层数据库访问的实现,例如 DataSource 接口和各种数据库驱动实现。
    • 这些实现提供了底层的数据库连接和操作功能,但不暴露给应用程序直接使用。
  4. 具体实现类(Concrete Implementor)
    • 具体实现类是实现部分的具体实现,比如 DriverManagerDataSourceC3P0DataSource 等。
    • 它们提供了具体的数据库连接池实现、连接配置等功能。
// 在创建JDBC的模板类时,需要传入数据源,这样JDBC的模板类才知道连接哪个数据库

解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!,Spring设计模式,spring boot,设计模式,桥接模式

解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!,Spring设计模式,spring boot,设计模式,桥接模式

解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!,Spring设计模式,spring boot,设计模式,桥接模式文章来源地址https://www.toymoban.com/news/detail-833953.html

到了这里,关于解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring中的设计模式

    目录 1.Spring中使用到的设计模式有: 2.工厂模式 3.单例模式 4.代理模式 5.模板模式 6.适配器模式         工厂模式:实现IoC容器         单例模式:将bean设置为单例         代理模式:AOP的底层实现         模板模式:比如引入jdbc依赖后出现的jdbcTemplate         适配器模

    2024年02月12日
    浏览(45)
  • 设计模式 07 桥接模式

    桥接模式(Bridge Pattern)属于 结构型 模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为 柄体 (Handle and Body)模式或 接口 (Interface)模式。 比如需要创建电脑对象,市面上的电脑非常多, 品牌 有华为、苹果、联

    2024年02月11日
    浏览(58)
  • 设计模式详解-桥接模式

    类型:结构型模式 实现原理:将抽象类和实现类分离,使其独立,然后使用接口再将二者连接起来。 意图:将抽象部分与实现部分分离,使它们都可以独立的变化。 主要解决:类变化频繁时用继承可能会出现的类爆炸问题。 如何解决:减少类的耦合关系,让类独立变化。

    2024年02月12日
    浏览(45)
  • 设计模式:桥接模式

    桥接模式(Bridge Pattern):旨在将抽象部分和实现部分解耦,使它们可以独立地变化。这种模式通过将抽象和实现分离,使它们可以独立地进行扩展和修改,而不会相互影响。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。 假如需要使用大

    2024年01月25日
    浏览(56)
  • 设计模式-桥接模式

    适配器模式 类似,以后也会遇到意思接近一样的设计模式。在开发中一般多个模式混用,且根据不同的场景进行搭配,桥接模式也是 结构型模式 将抽象的部分和实现的部分分离,使它们都可以独立的变化。通俗来说,就是通过组合来 桥接 其它的 行为或维度 与适配器模式业

    2024年02月11日
    浏览(47)
  • 【设计模式】桥接模式

    桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结

    2024年02月13日
    浏览(65)
  • 设计模式——桥接模式

    引用 桥 我们大家都熟悉,顾名思义就是用来将河的两岸联系起来的。而此处的桥是用来将两个独立的结构联系起来,而这两个被联系起来的结构可以独立的变化,所有其他的理解只要建立在这个层面上就会比较容易。 基本介绍 桥接模式(Bridge)是指将实现与抽象放在两个不

    2024年02月12日
    浏览(53)
  • 设计模式——桥接模式详解

    1.1⭐桥接模式的定义 维基百科: 桥接模式 是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。 百度百科: 桥接模式 是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,

    2024年02月06日
    浏览(52)
  • 设计模式之~桥接模式

    桥接模式:         将抽象部分与它的实现部分分离,使他们都可以独立地变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。         什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因

    2024年02月07日
    浏览(41)
  • 【前端设计模式】之桥接模式

    设计模式是在软件开发中经过验证的解决问题的方法。它们是从经验中总结出来的,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。无论是前端还是后端开发,设计模式都扮演着重要的角色。在本专栏中,我们将探索一些常见的前端设计模

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包