程序员必知!桥接模式的实战应用与案例分析 - 程序员古德
定义“
桥接模式是一种结构型设计模式,通过将抽象部分与实现部分分离,使它们可以独立变化,实现更大程度的松耦合,如,在电商设计中,桥接模式允许将手机抽象类与品牌实现类分离,使得添加新品牌或功能无需修改现有类结构,提高了代码的灵活性和可维护性。
”
程序员必知!桥接模式的实战应用与案例分析 - 程序员古德
桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要意图是将抽象部分与它的实现部分分离,使它们都可以独立地变化,这种类型的设计模式属于结构型模式,它提供了类的更大程度的松耦合。简单地说,桥接模式允许你在不改变现有类结构的情况下,将新的功能或行为添加到类中,通常是引入一个接口或使用组合来实现,将类的抽象部分与其实现部分相分离。
假设你正在开发一个电商系统,平台销售各种品牌的手机。先创建一个手机抽象类,这个类包含所有手机共有的属性,如屏幕大小、电池容量等,每个品牌的手机,如苹果、三星等,都有自己特定的实现,比如操作系统、用户界面等。如果你不使用桥接模式,每当引入一个新的品牌或一个新的功能时,你可能需要为每个品牌的手机创建新的子类,这将导致类的数量迅速增长,并且代码会变得难以管理和扩展。
如果使用桥接模式,则可以将手机抽象类和手机品牌实现类分离开来,手机抽象类定义了一组通用的手机功能,而每个品牌的实现类则提供了特定的实现细节,这样,可以轻松地添加新的品牌或功能,而无需修改现有的类结构。
代码案例程序员必知!桥接模式的实战应用与案例分析 - 程序员古德
1、反例:未使用桥接模式
假设需要开发一个绘图程序,该程序可以绘制不同形状(如圆形、矩形)和不同颜色(如红色、绿色),未使用桥接模式时,可能会为每种形状和颜色的组合创建一个具体的类,如下代码:
// 抽象形状类
public abstract class Shape {
protected int x, y;
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
public abstract void draw();
}
// 红色圆形类
public class RedCircle extends Shape {
public RedCircle(int x, int y) {
super(x, y);
}
@Override
public void draw() {
System.out.println("Drawing a red circle at (" x ", " y ")");
}
}
// 绿色矩形类
public class GreenRectangle extends Shape {
public GreenRectangle(int x, int y) {
super(x, y);
}
@Override
public void draw() {
System.out.println("Drawing a green rectangle at (" x ", " y ")");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Shape redCircle = new RedCircle(10, 20);
Shape greenRectangle = new GreenRectangle(30, 40);
redCircle.draw(); // 输出: Drawing a red circle at (10, 20)
greenRectangle.draw(); // 输出: Drawing a green rectangle at (30, 40)
}
}
代码分析:上述代码虽然可以实现功能,但存在以下问题:
2、正例:使用桥接模式
第一步,抽象化角色,定义了一个接口,该接口持有对实现化对象的引用,并将客户端的请求转发给实现化对象。
// 抽象形状类
public abstract class Shape {
protected DrawAPI drawAPI;
protected int x, y;
public Shape(int x, int y, DrawAPI drawAPI) {
this.x = x;
this.y = y;
this.drawAPI = drawAPI;
}
public abstract void draw();
}
第二步,扩展抽象化角色,扩展了抽象化角色,实现了具体的业务逻辑。
// 圆形类
public class Circle extends Shape {
public Circle(int x, int y, DrawAPI drawAPI) {
super(x, y, drawAPI);
}
@Override
public void draw() {
drawAPI.drawCircle(x, y);
}
}
// 矩形类
public class Rectangle extends Shape {
public Rectangle(int x, int y, DrawAPI drawAPI) {
super(x, y, drawAPI);
}
@Override
public void draw() {
drawAPI.drawRectangle(x, y);
}
}
第三步,实现化角色,定义了实现化角色的接口,这个接口不一定要与抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只包含基本的操作,而抽象化角色中的“业务逻辑”是根据客户端的需求对实现化角色的操作进行组合。
// 绘图API接口
public interface DrawAPI {
void drawCircle(int x, int y);
void drawRectangle(int x, int y);
}
第四步,具体实现化角色(Concrete Implementor):实现了实现化角色接口,提供了具体的实现。
// 红色绘图类
public class RedDrawAPI implements DrawAPI {
@Override
public void drawCircle(int x, int y) {
System.out.println("Drawing a red circle at (" x ", " y ")");
}
@Override
public void drawRectangle(int x, int y) {
System.out.println("Drawing a red rectangle at (" x ", " y ")");
}
}
第五步,客户端代码,客户端代码通过组合抽象化角色和实现化角色来创建具体的对象,然后调用相应的方法。
public class Client {
public static void main(String[] args) {
// 创建红色的绘图API实例
DrawAPI redDrawAPI = new RedDrawAPI();
// 使用红色的绘图API来创建圆形和矩形对象,并绘制它们。
Shape redCircle = new Circle(10, 20, redDrawAPI);
Shape redRectangle = new Rectangle(30, 40, redDrawAPI);
redCircle.draw(); // 输出: Drawing a red circle at (10, 20)
redRectangle.draw(); // 输出: Drawing a red rectangle at (30, 40)
}
}
代码分析:在这个例子中,使用了桥接模式来分离形状和颜色的实现,抽象形状类(Shape)持有一个对绘图API的引用,将形状的绘制请求转发给绘图API,这样,可以独立地改变形状和颜色的实现,而不会影响到对方,例如,可以很容易地添加新的形状或颜色,而无需修改现有的代码,这符合开闭原则,并且降低了代码的耦合性。
核心总结程序员必知!桥接模式的实战应用与案例分析 - 程序员古德
桥接模式的一大优点是降低耦合性,通过解耦抽象与实现,它使得这两者能够独立地发展和变化,这种分离允许我们分别对抽象和实现进行扩展和修改,而不会互相干扰,从而降低了代码的耦合度。
由于抽象与实现被分离,相同的实现可以被不同的抽象类共享,这种复用性不仅减少了代码的重复,还提高了开发效率,当需要修改或扩展系统时,我们只需针对相应的抽象类或实现类进行改动,而无需对整个系统进行大规模的调整,这使得系统维护变得相对简单和便捷。
桥接模式的缺点是当变化过多时,由于需要引入额外的抽象层,它可能会增加系统的复杂性,对于简单的系统或需求,使用桥接模式可能导致过度设计,增加系统的复杂性和理解难度。
当系统中存在多个独立的维度,且这些维度需要独立变化时,可以考虑使用桥接模式。例如,在图形绘制系统中(类似的),可以将形状和颜色的实现分离,使得它们能够独立变化而不影响对方。同时,在使用桥接模式之前,还需要仔细评估系统的需求和未来的扩展性,如果系统相对简单或不需要频繁进行扩展和修改,使用桥接模式可能带来不必要的复杂性。
关注我,每天学习互联网编程技术 - 程序员古德
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved