本文目录导读:

我将为您提供一个完整的Java桥接模式(Bridge Pattern)案例,从基础到进阶,包含实际应用场景。
基础案例:图形绘制系统
问题场景
我们需要绘制不同类型的图形(圆形、矩形),每种图形可以使用不同的绘制方式(矢量绘制、光栅绘制)。
不使用桥接模式的方案(问题演示)
// 不使用桥接模式 - 会有类爆炸问题
abstract class Shape {
abstract void draw();
}
// 四种组合类
class VectorCircle extends Shape {
@Override
void draw() {
System.out.println("使用矢量绘制圆形");
}
}
class RasterCircle extends Shape {
@Override
void draw() {
System.out.println("使用光栅绘制圆形");
}
}
class VectorRect extends Shape {
@Override
void draw() {
System.out.println("使用矢量绘制矩形");
}
}
class RasterRect extends Shape {
@Override
void draw() {
System.out.println("使用光栅绘制矩形");
}
}
// 如果增加新图形或新绘制方式,类会成倍增长!
使用桥接模式(解决方案)
// 1. 实现者接口(绘制方式)
interface DrawingAPI {
void drawCircle(double x, double y, double radius);
void drawRect(double x, double y, double width, double height);
}
// 2. 具体实现者A:矢量绘制
class VectorDrawing implements DrawingAPI {
@Override
public void drawCircle(double x, double y, double radius) {
System.out.printf("矢量绘制圆形 - 圆心(%f,%f) 半径%f%n", x, y, radius);
}
@Override
public void drawRect(double x, double y, double width, double height) {
System.out.printf("矢量绘制矩形 - 位置(%f,%f) 尺寸%fx%f%n", x, y, width, height);
}
}
// 3. 具体实现者B:光栅绘制
class RasterDrawing implements DrawingAPI {
@Override
public void drawCircle(double x, double y, double radius) {
System.out.printf("光栅绘制圆形 - 圆心(%f,%f) 半径%f%n", x, y, radius);
}
@Override
public void drawRect(double x, double y, double width, double height) {
System.out.printf("光栅绘制矩形 - 位置(%f,%f) 尺寸%fx%f%n", x, y, width, height);
}
}
// 4. 抽象类(图形)
abstract class Shape {
protected DrawingAPI drawingAPI;
protected Shape(DrawingAPI drawingAPI) {
this.drawingAPI = drawingAPI;
}
abstract void draw();
abstract void resizeByPercentage(double pct);
}
// 5. 扩展抽象类:圆形
class Circle extends Shape {
private double x, y, radius;
public Circle(double x, double y, double radius, DrawingAPI drawingAPI) {
super(drawingAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
@Override
void draw() {
drawingAPI.drawCircle(x, y, radius);
}
@Override
void resizeByPercentage(double pct) {
radius *= (1 + pct / 100);
}
}
// 6. 扩展抽象类:矩形
class Rectangle extends Shape {
private double x, y, width, height;
public Rectangle(double x, double y, double width, double height, DrawingAPI drawingAPI) {
super(drawingAPI);
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
@Override
void draw() {
drawingAPI.drawRect(x, y, width, height);
}
@Override
void resizeByPercentage(double pct) {
width *= (1 + pct / 100);
height *= (1 + pct / 100);
}
}
// 测试类
public class BridgePatternDemo {
public static void main(String[] args) {
// 创建不同的组合
Shape circle1 = new Circle(10, 20, 5, new VectorDrawing());
Shape circle2 = new Circle(15, 25, 8, new RasterDrawing());
Shape rect1 = new Rectangle(30, 40, 10, 20, new VectorDrawing());
Shape rect2 = new Rectangle(50, 60, 15, 25, new RasterDrawing());
// 绘制所有图形
System.out.println("=== 图形绘制演示 ===");
circle1.draw();
circle2.draw();
rect1.draw();
rect2.draw();
// 调整大小后再绘制
System.out.println("\n=== 调整大小后 ===");
circle1.resizeByPercentage(50); // 增大50%
circle1.draw();
rect2.resizeByPercentage(-20); // 减小20%
rect2.draw();
}
}
进阶案例:消息发送系统
// 1. 实现者接口(消息发送渠道)
interface MessageSender {
void send(String subject, String content);
}
// 2. 具体实现者A:邮件发送
class EmailSender implements MessageSender {
@Override
public void send(String subject, String content) {
System.out.println("【邮件】主题:" + subject);
System.out.println(" 内容:" + content);
System.out.println(" 发送完成!");
}
}
// 3. 具体实现者B:短信发送
class SmsSender implements MessageSender {
@Override
public void send(String subject, String content) {
System.out.println("【短信】内容:" + subject + ":" + content);
System.out.println(" 发送完成!");
}
}
// 4. 具体实现者C:微信发送
class WeChatSender implements MessageSender {
@Override
public void send(String subject, String content) {
System.out.println("【微信】标题:" + subject);
System.out.println(" 正文:" + content);
System.out.println(" 发送完成!");
}
}
// 5. 抽象类(消息类型)
abstract class Message {
protected MessageSender sender;
protected Message(MessageSender sender) {
this.sender = sender;
}
abstract void sendMessage(String subject, String content);
}
// 6. 扩展抽象类:普通消息
class NormalMessage extends Message {
public NormalMessage(MessageSender sender) {
super(sender);
}
@Override
void sendMessage(String subject, String content) {
sender.send(subject, content);
}
}
// 7. 扩展抽象类:加急消息
class UrgentMessage extends Message {
private int urgencyLevel;
public UrgentMessage(MessageSender sender, int urgencyLevel) {
super(sender);
this.urgencyLevel = urgencyLevel;
}
@Override
void sendMessage(String subject, String content) {
String urgentContent = "【加急级别" + urgencyLevel + "】" + content;
String urgentSubject = "【紧急】" + subject;
sender.send(urgentSubject, urgentContent);
// 加急消息可以额外发送通知
System.out.println("提示:已紧急通知相关人员!");
}
}
// 8. 扩展抽象类:定时消息
class ScheduledMessage extends Message {
private String scheduleTime;
public ScheduledMessage(MessageSender sender, String scheduleTime) {
super(sender);
this.scheduleTime = scheduleTime;
}
@Override
void sendMessage(String subject, String content) {
System.out.println("计划" + scheduleTime + "发送消息:");
sender.send("【定时】" + subject, content);
}
}
// 测试
public class MessageBridgeDemo {
public static void main(String[] args) {
System.out.println("=== 消息发送系统演示 ===\n");
// 创建发送渠道
MessageSender email = new EmailSender();
MessageSender sms = new SmsSender();
MessageSender wechat = new WeChatSender();
// 普通消息
System.out.println("--- 普通邮件消息 ---");
Message normalEmail = new NormalMessage(email);
normalEmail.sendMessage("项目进度", "项目已按时完成第一阶段");
System.out.println("\n--- 普通短信消息 ---");
Message normalSms = new NormalMessage(sms);
normalSms.sendMessage("验证码", "您的验证码是:123456");
// 加急消息
System.out.println("\n--- 加急微信消息 ---");
Message urgentWeChat = new UrgentMessage(wechat, 3);
urgentWeChat.sendMessage("服务器故障", "生产环境出现严重故障");
// 定时消息
System.out.println("\n--- 定时邮件消息 ---");
Message scheduledEmail = new ScheduledMessage(email, "2024-01-15 10:00:00");
scheduledEmail.sendMessage("周报", "这是本周工作汇报");
// 动态组合能力展示
System.out.println("\n--- 动态组合示例 ---");
Message urgentEmail = new UrgentMessage(email, 1);
urgentEmail.sendMessage("紧急会议", "请立即参加紧急会议");
}
}
实际应用:多平台UI组件
// 1. 实现者接口(平台实现)
interface Platform {
void render(String component, String style);
void handleEvent(String event, String component);
}
// 2. 具体实现者:Windows平台
class WindowsPlatform implements Platform {
@Override
public void render(String component, String style) {
System.out.println("Windows平台渲染" + component + ",样式:" + style);
}
@Override
public void handleEvent(String event, String component) {
System.out.println("Windows平台处理" + component + "的" + event + "事件");
}
}
// 3. 具体实现者:Mac平台
class MacPlatform implements Platform {
@Override
public void render(String component, String style) {
System.out.println("Mac平台渲染" + component + ",样式:" + style);
}
@Override
public void handleEvent(String event, String component) {
System.out.println("Mac平台处理" + component + "的" + event + "事件");
}
}
// 4. 具体实现者:Linux平台
class LinuxPlatform implements Platform {
@Override
public void render(String component, String style) {
System.out.println("Linux平台渲染" + component + ",样式:" + style);
}
@Override
public void handleEvent(String event, String component) {
System.out.println("Linux平台处理" + component + "的" + event + "事件");
}
}
// 5. 抽象类(UI组件)
abstract class UIComponent {
protected Platform platform;
protected String style;
protected UIComponent(Platform platform) {
this.platform = platform;
this.style = "默认样式";
}
abstract void display();
abstract void handleInput(String event);
protected void setStyle(String style) {
this.style = style;
}
}
// 6. 按钮组件
class Button extends UIComponent {
private String label;
public Button(Platform platform, String label) {
super(platform);
this.label = label;
}
@Override
void display() {
platform.render("按钮[" + label + "]", style);
}
@Override
void handleInput(String event) {
platform.handleEvent(event, "按钮[" + label + "]");
}
}
// 7. 文本框组件
class TextBox extends UIComponent {
private String placeholder;
public TextBox(Platform platform, String placeholder) {
super(platform);
this.placeholder = placeholder;
}
@Override
void display() {
platform.render("文本框[占位符:" + placeholder + "]", style);
}
@Override
void handleInput(String event) {
platform.handleEvent(event, "文本框[占位符:" + placeholder + "]");
}
}
// 8. 下拉列表组件
class DropDown extends UIComponent {
private String[] options;
public DropDown(Platform platform, String[] options) {
super(platform);
this.options = options;
}
@Override
void display() {
String optionStr = String.join(", ", options);
platform.render("下拉列表[" + optionStr + "]", style);
}
@Override
void handleInput(String event) {
platform.handleEvent(event, "下拉列表");
}
}
// 测试
public class UIComponentDemo {
public static void main(String[] args) {
System.out.println("=== 跨平台UI组件系统 ===\n");
// 创建平台实例
Platform windows = new WindowsPlatform();
Platform mac = new MacPlatform();
Platform linux = new LinuxPlatform();
// Windows平台组件
System.out.println("--- Windows平台组件 ---");
Button winButton = new Button(windows, "登录");
winButton.setStyle("现代风格");
winButton.display();
winButton.handleInput("点击");
TextBox winTextBox = new TextBox(windows, "请输入用户名");
winTextBox.display();
winTextBox.handleInput("输入");
// Mac平台组件
System.out.println("\n--- Mac平台组件 ---");
Button macButton = new Button(mac, "购买");
macButton.setStyle("简洁风格");
macButton.display();
macButton.handleInput("悬停");
DropDown macDropDown = new DropDown(mac, new String[]{"选项1", "选项2", "选项3"});
macDropDown.display();
macDropDown.handleInput("选择");
// Linux平台组件
System.out.println("\n--- Linux平台组件 ---");
Button linuxButton = new Button(linux, "确认");
linuxButton.setStyle("复古风格");
linuxButton.display();
linuxButton.handleInput("键盘输入");
TextBox linuxTextBox = new TextBox(linux, "搜索...");
linuxTextBox.display();
// 动态切换平台(桥接模式的优势)
System.out.println("\n--- 动态切换平台演示 ---");
Button flexibleButton = new Button(windows, "灵活按钮");
flexibleButton.display();
// 运行时更换实现
UIComponent[] components = {flexibleButton};
// 模拟平台切换
for (UIComponent component : components) {
if (component instanceof Button) {
// 实际应用中可以通过工厂模式创建新按钮
Button newButton = new Button(mac, "灵活按钮");
newButton.setStyle("时尚风格");
newButton.display();
}
}
}
}
桥接模式要点总结
优点
- 解耦抽象和实现:两者可以独立变化,互不影响
- 避免类爆炸:减少了类的数量
- 更好的扩展性:可以独立扩展抽象和实现
缺点
- 增加系统复杂度:增加了抽象层的理解难度
- 设计难度增加:需要正确的识别抽象和实现
适用场景
- 需要跨越多个维度扩展系统时
- 不希望使用继承导致类爆炸时
- 需要在运行时切换实现时
- 抽象和实现之间有稳定关系时
通过这些案例,可以看到桥接模式在解决多维度变化问题时的强大能力,使得系统更加灵活和可维护。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播