身为java开发人员,你知道桥接模式还能这样用吗?
2020-08-04 本文已影响0人
程序员伟杰
桥接模式
桥接模式定义:
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。
在生活中有很多桥接模式的例子,比如:
- 在纸上画图,可以选择红色的彩笔,也可以选择绿色的彩笔;
- 自制饮料,可以选择西瓜做原材料,也可以选择草莓做原材料;
- 泡茶,可以选择毛尖茶,也可以选择花茶;
这些例子的共同特点都是做一件事,可以选择不同的方法去做,并且做得结果是不同的;
所以桥接模式的含义就是,将这些不同的方法(实现部分)分离出来,使它们可以独立变化。
模式优缺点
优点
- 由于抽象与实现分离,所以扩展能力强;
- 其实现细节对客户透明。
缺点
- 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
模式角色
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
示例
1. 示例描述
制作饮料案例,选择不同的原材料做果汁,原材料有苹果、橘子。
2. 设计思路
可以按照以下步骤进行
- 定义桥接口,原材料不同导致最终结果不同,所以桥接口定义为
果汁源材料JuiceMaterial - 定义具体原材料,AppleMaterial和OrangeMaterial
- 定义抽象类Machine,并抽象work方法
- 定义榨汁机具体类JuiceExtractor 并集成Machine,重写
工作方法,并可以更换原材料。
3. 示例代码
-
果汁原材料抽象接口
/** * @Description 果汁原材料 */ public interface JuiceMaterial { /** * 获取原材料名 * @return 原材料名 */ String getMaterial(); } -
原材料具体接口
/** * @Description 苹果原材料 */ public class AppleMaterial implements JuiceMaterial { @Override public String getMaterial() { return "apple"; } } /** * @Description 橘子原材料 */ public class OrangeMaterial implements JuiceMaterial { @Override public String getMaterial() { return "orange"; } } -
抽象机器接口
/** * @Description 机器 */ public abstract class Machine { /** * 机器工作运转 */ protected abstract void work(); } -
具体机器接口
/** * @Description 榨汁机 */ public class JuiceExtractor extends Machine { private JuiceMaterial juiceMaterial; public JuiceExtractor(JuiceMaterial material){ this.juiceMaterial = material; } @Override protected void work() { System.out.println( String.format("The %s juice is being squeezed!" , this.juiceMaterial.getMaterial()) ); } } -
测试代码
@Test public void test(){ JuiceMaterial appleMaterial = new AppleMaterial(); JuiceMaterial orangeMaterial = new OrangeMaterial(); Machine appleJuiceExtractor = new JuiceExtractor(appleMaterial); appleJuiceExtractor.work(); Machine orangeJuiceExtractor = new JuiceExtractor(orangeMaterial); orangeJuiceExtractor.work(); } -
测试结果
The apple juice is being squeezed!
The orange juice is being squeezed!
最后
感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!