桥接Bridge
发表于|更新于|设计模式
|浏览量:
- 分离抽象与具体实现,让他们可以独自发展
- 用聚合代替继承的方式连接抽象和具体

应用1
Gift -> WarmGift ColdGift WildGift
GiftImpl -> Flower Ring Car
最终抽象类(Gift)的精确抽象(WarmGift) 里面组合了 实现类(GiftImpl)的 具体实现(Flower)
应用2
还有一个遥控和播放器的例子。两个都是接口,遥控是抽象类,播放器是实现类,播放器不包含遥控,但是遥控要控制播放器就要组合播放器。电视遥控组合电视,广播遥控组合广播
代码实现:
https://refactoringguru.cn/design-patterns/bridge/java/example#example-0--remotes-Remote-java
文章作者: 褚成志
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 褚成志的分享站!
相关推荐
2026-04-09
代理模式Proxy
问题提出:benchMark 性能测试,不修改原来代码,记录代码的运行时间: **继承实现:**类爆炸 **手动组合:**自己使用代理类包装,代理类里面调用被代理对象,附加上自己的事情。 实现同一个接口可以实现代理的嵌套,当需要实现多个代理功能的时候 限制就是要实现同一个接口 全能代理:不同接口,解耦,动态代理,运行时候生成。 **java.lang.reflect.Proxy **:通过反射getClass(Loader),不需要读取源码,只需要二进制字节码就得到属性和方法。 被代理类需要有接口:代理遵循接口才能伪装为服务的对象,让外界调用接口即可,我们负责替换 cglib:底层也是asm。但是其实是生成了一个被代理类的子类,所以当一个类是final的时候,是不可以使用这个来实现代理的 asm:甚至可以代理final,因为直接修改二进制字节码,所以随意 注意字节码class文件是二进制的,使用IDE打开的时候是显示反编译之后的代码,其实不是文件真正存放的内容 静态代理–自己包装被包装和包装类都要实现一样的接口, 构造的时候都使用接口作为形参,传递实参的时...
2026-04-09
适配器_转换器模式adapter
Target(目标接口):所需要转换的所期待的接口 Adaptee(源角色):需要适配的接口 Adapter(适配器):将原接口适配成目标接口,继承原接口,实现目标接口 一些流处理器是对其它类型的流源的适配。这就是适配器模式的应用 FutureTask接收Runnabel转换为Callable 使用的是Executors 里面的RunnableAdapter 自己有Runnable属性,自己还实现了Callable接口。在call里面调用了run方法,实现适配、 传进去Runnable,拿到一个Callable来使用 [Input/Output]Stream[Reader/Writer]流InputStreamReader实现了Reader接口,并持有了InputStream的引用,这里是通过StreamDecoder类间接持有的,因为从byte到char要经过解码。 适配器就是InputStreamReader类, 源角色就是InputStream代表的实例对象, 目标接口就是Reader类了。 I/O类库中还有很多类似的用法,如Stri...
2026-04-09
享元模式FlyWeight
共享元对象,放到一个池子里面 池化思想,提前几个,重复利用, String使用的就是享元(常量池)s3.intern() 内部指向常量池的引用,****intern就能拿到常量池的引用 123456789101112131415public class TestString { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s1 == s2); //true System.out.println(s1 == s3); //false System.out.println(s3 == s4); //false ...
2026-04-09
装饰者模式Decorator
简单版防止类爆炸 类继承是会造成耦合度很高 用聚合代替继承,和代理不一样的是主动权在谁手里,聚合是主动的,自己知道的,代理是被动,自己甚至不知道 Component:抽象被装饰组件,定义都有哪些功能。 ConcreteComponent:抽象被装饰组件实现类 Decorator:抽象****装饰器,不一定是接口,它持有一个Component对象实例的引用,定义一个与抽象被装饰组件一致的接口; ConcreteDecorator:具体****装饰器,负责实现装饰器角色定义的功能。 详细版我们在做一个产品的时候,可能并没有考虑到新需求的场景,此时就需要为某些组件添加新的功能来满足这些需求。 如果要符合开放-封闭的原则,我们最好不要直接修改已有的具体实现类,因为会破坏其已有的稳定性。 继承,在某些场景下是不可行的,例如,要覆盖的方法被 final 关键字修饰了,那么在 Java 的语法中就无法被覆盖。使用继承方案的另一个缺点就是整个继承树的膨胀,例如,当新需求存在多种排列组合或是复杂的判断时,那就需要写非常多的子类实现。 应该尽量多地使用组合方式进行扩展,尽量少使用继承方式进行扩...
2026-04-09
组合模式Composite
树状结构,有些包含子节点,有些只有自己 文件夹和文件的关系 快递包装和快递内容物的关系 实现 确保应用的核心模型能够以树状结构表示。 尝试将其分解为简单元素和容器。 记住, 容器必须能够同时包含简单元素和其他容器。 声明组件接口及其一系列方法, 这些方法对简单和复杂元素都有意义。 创建一个叶节点类表示简单元素。 程序中可以有多个不同的叶节点类。 创建一个容器类表示复杂元素。 在该类中, 创建一个数组成员变量来存储对于其子元素的引用。 该数组必须能够同时保存叶节点和容器, 因此请确保将其声明为组合接口类型。实现组件接口方法时, 记住容器应该将大部分工作交给其子元素来完成。 最后, 在容器中定义添加和删除子元素的方法。记住, 这些操作可在组件接口中声明。 这将会违反_接口隔离原则_, 因为叶节点类中的这些方法为空。 但是, 这可以让客户端无差别地访问所有元素, 即使是组成树状结构的元素。 注意下面实现中,容器实现的时候除了自己的增加和删除方法,继承自父接口的方法都是尽量去调用自己的孩子节点去处理,调用孩子节点的同样的方法,因为他的孩子也一定实现了这个方法。 1234567891...
2026-04-09
访问者Visitor
在结构不变的情况下动态改变内部元素的动作 适合用在接口结构基本固定不变的 实现案例123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116package com.deltaqin.designPattern.d04_visitor;// 根据不同的访问者访问的不同商品,给不同的价格// 计算的规则定义在访问者上面,不同访问者对从商品获得的相同的信息实现自己的逻辑// 同一个被访问者传递给不同访问者的消息是一样的。public class Computer { ComputerPart cpu = new CPU(); ComputerPar...
公告
👋 你好,我是褚成志,一名专注于云原生与后端架构的工程师。
热爱 Java、Kubernetes、Linux、Redis、Spring 等技术领域,持续探索 AGI 与智能化运维的边界。
这里记录我的技术思考与实践总结,欢迎交流!
热爱 Java、Kubernetes、Linux、Redis、Spring 等技术领域,持续探索 AGI 与智能化运维的边界。
这里记录我的技术思考与实践总结,欢迎交流!