二十三种设计模式第十一篇–桥接模式

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。二十三种设计模式第十一篇–桥接模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

好久没写博客了,自从进入6月份,毕业季,全是在忙毕业的事情,都没怎么学习代码软件工程知识了,这二十三种设计模式还是得学完哈!持之以恒,我本来为了学这二十三种设计模式的初衷是为了顺利度过软考,但是后边发现我这个职业生活中,还是将这二十三种设计模式全部搞懂的好!就举一个例子,学Java的,Spring 框架中有多少种设计模式?

在spring框架中,使用了多种设计模式来实现不同的功能和解决不同的问题。
我只例举一些我见到过的设计模式:

  1. 单例模式:Spring容器默认使用单例模式管理Bean对象,确保每个Bean只有一个实例。

  2. 工厂模式:Spring使用工厂模式来创建和管理Bean对象,通过BeanFactory或ApplicationContext来获取Bean实例。

  3. 代理模式:Spring AOP(面向切面编程)使用了代理模式来实现横切关注点的功能,如事务管理、日志记录等。

  4. 观察者模式:Spring的事件机制使用了观察者模式,通过事件发布和监听来实现模块之间的解耦。

  5. 模板方法模式:Spring的JdbcTemplate和HibernateTemplate等模板类使用了模板方法模式,将一些通用的操作封装在模板方法中,具体实现由子类来完成。

  6. 适配器模式:Spring的适配器模式用于将不同的接口适配成统一的接口,如HandlerAdapter用于适配不同类型的Controller。

  7. 建造者模式:Spring的BeanDefinitionBuilder和BeanDefinitionReader等类使用了建造者模式,通过链式调用来构建Bean定义。

  8. 迭代器模式:Spring的集合类如List、Set等都实现了迭代器模式,提供了统一的遍历方式

今天我们来讲解的是桥接模式,桥接模式,实际上是将抽象化和实现化解耦,让两者可以独立的进行变化

桥接模式
根据以上UML图我们来设计一个桥接模式代码。

来先上接口

/**
 * 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用
 * 使用 DrawAPI 接口创建抽象类 Shape
 */
public interface DrawAPI {

   public void drawCircle(int radius, int x, int y);

}

根据接口撰写实现类

/**
 *  具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
 * 创建实现了 DrawAPI 接口的实体桥接实现类
 */
public class RedDraw implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: red, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

/**
 *  具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
 * 创建实现了 DrawAPI 接口的实体桥接实现类
 */
public class GreenDraw implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: green, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }

/**
 * 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
 * 实现了 Shape 抽象类的实体类
 */
public class Circle extends Shape {
   private int x, y, radius;
 
   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }
 
   @Override
   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}

/**
 * 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用
 * 创建桥接实现接口
 */
public abstract class Shape {
   //有一个抽象角色的引用, 实现组合关系.
   protected DrawAPI drawAPI;

   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }

   //具体的绘制由子类实现》
   public abstract void draw();  
}

/**
 * 测试类
 * 使用 Shape 和 DrawAPI 类画出不同颜色的圆
 */
public class BridgePatternDemo {

   public static void main(String[] args) {

      Shape redCircle = new Circle(100,100, 10, new RedDraw());
      Shape greenCircle = new Circle(100,100, 10, new GreenDraw());
 
      redCircle.draw();
      greenCircle.draw();
   }
}

至此,桥接模式的代码书写完整。

注意,这里再次提醒一下,桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过将抽象和实现分离,可以使它们可以独立地进行扩展和变化,而不会相互影响。

在桥接模式中,抽象部分和实现部分分别由抽象类和实现类来表示。抽象类定义了抽象部分的接口,而实现类则实现了抽象部分的接口。抽象类中包含一个指向实现类的引用,通过这个引用,抽象类可以调用实现类中的方法。

桥接模式的核心思想是将抽象部分和实现部分分离,使它们可以独立地变化。这样一来,当需要新增一种抽象部分或实现部分时,只需要新增对应的抽象类或实现类即可,而不需要修改已有的代码。这种设计思想符合开闭原则,可以提高系统的可扩展性和可维护性。

桥接模式的应用场景包括:

当一个类存在两个或多个独立变化的维度时,可以使用桥接模式将它们分离,使它们可以独立地变化。

当一个类需要在运行时切换不同的实现时,可以使用桥接模式。

当一个类需要通过继承来扩展功能时,可以使用桥接模式,而不是使用多层继承。

总结起来,桥接模式通过将抽象部分和实现部分分离,使它们可以独立地变化,提高了系统的可扩展性和可维护性。它适用于存在多个独立变化的维度的场景,以及需要在运行时切换不同实现的场景。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/197955.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!