好久没写博客了,自从进入6月份,毕业季,全是在忙毕业的事情,都没怎么学习代码软件工程知识了,这二十三种设计模式还是得学完哈!持之以恒,我本来为了学这二十三种设计模式的初衷是为了顺利度过软考,但是后边发现我这个职业生活中,还是将这二十三种设计模式全部搞懂的好!就举一个例子,学Java的,Spring 框架中有多少种设计模式?
在spring框架中,使用了多种设计模式来实现不同的功能和解决不同的问题。
我只例举一些我见到过的设计模式:
-
单例模式:Spring容器默认使用单例模式管理Bean对象,确保每个Bean只有一个实例。
-
工厂模式:Spring使用工厂模式来创建和管理Bean对象,通过BeanFactory或ApplicationContext来获取Bean实例。
-
代理模式:Spring AOP(面向切面编程)使用了代理模式来实现横切关注点的功能,如事务管理、日志记录等。
-
观察者模式:Spring的事件机制使用了观察者模式,通过事件发布和监听来实现模块之间的解耦。
-
模板方法模式:Spring的JdbcTemplate和HibernateTemplate等模板类使用了模板方法模式,将一些通用的操作封装在模板方法中,具体实现由子类来完成。
-
适配器模式:Spring的适配器模式用于将不同的接口适配成统一的接口,如HandlerAdapter用于适配不同类型的Controller。
-
建造者模式:Spring的BeanDefinitionBuilder和BeanDefinitionReader等类使用了建造者模式,通过链式调用来构建Bean定义。
-
迭代器模式: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();
}
}
至此,桥接模式的代码书写完整。
注意,这里再次提醒一下,桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过将抽象和实现分离,可以使它们可以独立地进行扩展和变化,而不会相互影响。
在桥接模式中,抽象部分和实现部分分别由抽象类和实现类来表示。抽象类定义了抽象部分的接口,而实现类则实现了抽象部分的接口。抽象类中包含一个指向实现类的引用,通过这个引用,抽象类可以调用实现类中的方法。
桥接模式的核心思想是将抽象部分和实现部分分离,使它们可以独立地变化。这样一来,当需要新增一种抽象部分或实现部分时,只需要新增对应的抽象类或实现类即可,而不需要修改已有的代码。这种设计思想符合开闭原则,可以提高系统的可扩展性和可维护性。
桥接模式的应用场景包括:
当一个类存在两个或多个独立变化的维度时,可以使用桥接模式将它们分离,使它们可以独立地变化。
当一个类需要在运行时切换不同的实现时,可以使用桥接模式。
当一个类需要通过继承来扩展功能时,可以使用桥接模式,而不是使用多层继承。
总结起来,桥接模式通过将抽象部分和实现部分分离,使它们可以独立地变化,提高了系统的可扩展性和可维护性。它适用于存在多个独立变化的维度的场景,以及需要在运行时切换不同实现的场景。