桥接模式
基本介绍
1.将实现与抽象放在两个不同的层次中,使两个层次可以独立改变
2.基于类的最小设计原则,通过封装、集合及继承等行为让不同的类承担不同的职责
3.主要特点:把抽象与行为实分离,从而可以保持各部分的独立性以及其应对的功能扩展
角色
1.Client类:客户端,桥接模式的调用者
2.Abstraction:充当了桥接类,维护 Implementor 的实现类 ConcreteImplementor
(1)Abstraction 是抽象类,聚合、调用 Implementor
(2)RefinedAbstraction:是 Abstraction 的实现子类
3.Implementor:行为实现类的接口
(1)被 Abstraction 聚合、调用
(2)ConcreteImplementor:行为类的具体实现类
事项
1.优点
(1)实现了抽象和实现部分的分离独立,提高了系统的灵活性,有助于系统进行分层设计,产生更好的结构化系统
(2)对于系统的高层部分,只需要知道抽象部分和实现部分的接口即可,其它的部分由具体业务来完成
(3)桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
2.缺点
(1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景
3.应用场景
(1)不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统
(2)如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系
(3)一个类存在两个独立变化的维度,且这两个维度都需要进行扩展
(4)常见:JDBC驱动程序;银行转账系统:转账分类、转账用户类型;消息管理:消息类型、消息分类
桥接模式、装饰者模式
1.桥接模式
(1)分离:结构与实现分离(当结构和实现有可能发生变化时)或属性与基于属性的行为实现分离
(2)行为:横向的行为,行为之间无关联
2.装饰者模式
(1)分离:对基于属性的行为进行封装,成为独立的类
(2)行为:具有可叠加性,其表现出来的结果是一个整体,一个各个行为组合后的一个结果
桥接模式、 访问者模式
1.桥接模式
(1)将抽象部分(属性)与它的实现部分分离,使它们都可以独立地变化
(2)桥接模式主要用于将对象的抽象部分和实现部分隔离,使得各自承担责任,可独立变化
(3)桥接模式添加的方法彼此不相同,但相关
(4)桥接模式没有对象结构,通过在 Abstraction 中聚合 Implementor,构造器 / setter 方法传入 ConcreteImplementor,实现新方法的添加
2.访问者模式
(1)表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这些元素的新操作
(2)访问者模式主要用于为某对象结构中包含的多类对象灵活添加新功能
(3)访问者模式添加的新功能彼此不相同且不相关
(4)访问者模式通过对象结构遍历所有具体元素
代码示例
public class Bridge {//客户端
public static void main(String[] args) {
Mail mail = new Mail();
WeChat weChat = new WeChat();
Prompt prompt = new Prompt(mail);
Delay delay = new Delay(mail);
prompt.send();
delay.send();
prompt.setSource(weChat);
delay.setSource(weChat);
prompt.send();
delay.send();
}
}
interface Source {//行为实现类的接口
void send();
}
class Mail implements Source {//行为类的具体实现类
@Override
public void send() {
System.out.print("邮件的");
}
}
class WeChat implements Source {//行为类的具体实现类
@Override
public void send() {
System.out.print("微信的");
}
}
abstract class Message {//抽象桥接类
public Source source;
public Message(Source source) {
this.source = source;
}
public void setSource(Source source) {
this.source = source;
}
public void send() {
source.send();
}
}
class Prompt extends Message {//抽象桥接类的实现子类
public Prompt(Source source) {
super(source);
}
@Override
public void send() {
super.send();
System.out.println("即时消息");
}
}
class Delay extends Message {//抽象桥接类的实现子类
public Delay(Source source) {
super(source);
}
@Override
public void send() {
super.send();
System.out.println("延迟消息");
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战