【设计模式】桥接模式
使用频率:★★★☆☆#
一、什么是桥接模式#
将对象的行为抽象为接口,作为抽象类的成员属性在抽象层进行组合(个人理解,仅供参考);
二、补充说明#
改变对象与其行为的强耦合关系,使之与行为解耦;
使对象的行为以及对象本身都能独立变化;
三、角色#
抽象类
具体实现类
行为接口
具体行为实现类
客户端
四、例子,JAVA实现#
例子说明:
对象:人(有中国人、印度人。。。。)
行为:吃(用筷子吃、用手吃、用叉子吃。。。)
假设一个场景:有一个中国人和欧洲人,中国人用筷子吃,欧洲人用叉子吃,如果我们要对这两个人进行封装,一般用以下方式:
抽象出一个抽象人类,新建两个具体类继承抽象人类,其中一个实现筷子吃行为,另一个实现用叉子吃行为;
缺点:具体的人对象与吃的行为变成了强耦合关系,修改和扩展都不方便;说不定哪天中国人去吃西餐,用叉子吃,这时候就需要改变具体中国人实现类代码;
假设使用桥接模式,我们可以这样设计:
对吃行为抽象成一个接口,并定义好各自的实现类(用筷子吃实现类,用手吃实现类,用叉子吃实现类);
还是抽象出一个抽象人类,不过要在这个抽象人类中组合进一个吃行为接口;
具体的中国人或欧洲人继承抽象人类,但其不需要实现具体吃行为,只需要对其成员属性(吃行为接口)赋一个具体实现对象即可;
代码实现如下:
吃行为接口:
package com.pichen.dp.structuralpattern.bridge; /** * 吃行为接口 * @author pi chen * @version V1.0.0, 2016年2月19日 * @see * @since V1.0.0 */ public interface Eatable { public void eat(); }
吃行为实现类(用筷子吃实现类,用手吃实现类,用叉子吃实现类):

package com.pichen.dp.structuralpattern.bridge; public class EatWithChopsticks implements Eatable{ @Override public void eat() { System.out.println("Eat with Chopsticks"); } }

package com.pichen.dp.structuralpattern.bridge; public class EatWithHand implements Eatable{ @Override public void eat() { System.out.println("Eat with Hand"); } }

package com.pichen.dp.structuralpattern.bridge; public class EatWithFork implements Eatable{ @Override public void eat() { System.out.println("Eat with Fork"); } }
抽象人类:
package com.pichen.dp.structuralpattern.bridge; public abstract class Person { //吃行为抽象为接口,使之与具体对象解耦 protected Eatable eatable; /** * @return the eatable */ public Eatable getEatable() { return eatable; } /** * @param eatable the eatable to set */ public void setEatable(Eatable eatable) { this.eatable = eatable; } }
具体的不同种类的人(中国人、欧美人、印度人):

package com.pichen.dp.structuralpattern.bridge; public class Chinese extends Person{ public Chinese(Eatable eatable) { this.eatable = eatable; } }

package com.pichen.dp.structuralpattern.bridge; public class European extends Person{ public European(Eatable eatable) { this.eatable = eatable; } }

package com.pichen.dp.structuralpattern.bridge; public class Indian extends Person{ public Indian(Eatable eatable) { this.eatable = eatable; } }
客户端:
package com.pichen.dp.structuralpattern.bridge; public class Main { public static void main(String[] args) { //定义三种具体行为 Eatable eatWithChopsticks = new EatWithChopsticks(); Eatable eatWithFork = new EatWithFork(); Eatable eatWithHand = new EatWithHand(); //定义三中具体人 Person chinese = new Chinese(eatWithChopsticks); Person indian = new Indian(eatWithHand); Person european = new European(eatWithFork); //中国人用筷子吃,印度人用手,欧洲人用叉子 chinese.getEatable().eat(); indian.getEatable().eat(); european.getEatable().eat(); //当然,中国人有时候也用叉子吃西餐,或用手吃 chinese.setEatable(eatWithFork); chinese.getEatable().eat(); chinese.setEatable(eatWithHand); chinese.getEatable().eat(); } }
结果打印:
Eat with Chopsticks
Eat with Hand
Eat with Fork
Eat with Fork
Eat with Hand
分类:
设计模式
标签:
DesignPattern
, JAVA
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单