一、概述
        将类的抽象部分与实现分部分离开来,使它们都可以独立地变化。
二、适用性
1.你不希望在抽象和实现之间有一个固定的绑定关系的时候。例如:在程序运行时实现部分应可以被选择或切换。
2.类的抽象以及实现都应该可以通过生成子类的方法加以扩充的时候。桥接模式使你可以对不同的抽象接口和实现进行组合,并且分别对它们进行扩充。
3.对一个抽象的实现部分的修改应对客户不产生影响的时候,即客户的代码不必重新编译。
4.你必须将一个对象分解成两个部分的时候。
5.你想在多个对象间共享实现(可能使用引用计数),但是同时要求客户并不知情的时候。
三、参与者
1.Abstraction:定义抽象类的接口。维护一个指向Implementor类型对象的指针。
2.RefinedAbstraction:扩充由Abstraction定义的接口。
3.Implementor:定义实现类的接口。该接口不一定要与Abstraction接口完全一致。事实上可以完全不同。一般而言,Implementor接口提供基本操作,而Abstraction接口提供较高层次操作。
4.ConcreteImplementor:实现Implementor接口,并且定义它的具体实现。
四、类图
五、示例
Abstraction
  1. package cn.lynn.bridge;
  2. public abstract class Player {
  3. private Equipment equipment;
  4. private String gender;
  5. public String getGender() {
  6. return gender;
  7. }
  8. public void setGender(String gender) {
  9. this.gender = gender;
  10. }
  11. public Equipment getEquipment() {
  12. return equipment;
  13. }
  14. protected abstract void buyEquipment();
  15. }

RefinedAbstraction

  1. package cn.lynn.bridge;
  2. public class MalePlayer extends Player {
  3. public MalePlayer() {
  4. super.setGender("男性玩家");
  5. }
  6. @Override
  7. public void buyEquipment() {
  8. super.getEquipment().playerBuyEquipment(this);
  9. }
  10. }
  1. package cn.lynn.bridge;
  2. public class FemalePlayer extends Player {
  3. public FemalePlayer() {
  4. super.setGender("女性玩家");
  5. }
  6. @Override
  7. public void buyEquipment() {
  8. super.getEquipment().playerBuyEquipment(this);
  9. }
  10. }

Implementor

  1. package cn.lynn.bridge;
  2. public abstract class Equipment {
  3. protected abstract void playerBuyEquipment(Player player);
  4. }

ConcreteImplementor

  1. package cn.lynn.bridge;
  2. public class Arms extends Equipment {
  3. @Override
  4. public void playerBuyEquipment(Player player) {
  5. System.out.println(player.getGender() + "购买武器装备!");
  6. }
  7. }
  1. package cn.lynn.bridge;
  2. public class Armour extends Equipment {
  3. @Override
  4. public void playerBuyEquipment(Player player) {
  5. System.out.println(player.getGender() + "购买铠甲装备!");
  6. }
  7. }

Client

  1. package cn.lynn.bridge;
  2. public class Client {
  3. public static void main(String[] args) {
  4. Player malePlayer = new MalePlayer();
  5. Player femalePlayer = new FemalePlayer();
  6. Equipment arms = new Arms();
  7. arms.playerBuyEquipment(malePlayer);
  8. arms.playerBuyEquipment(femalePlayer);
  9. Equipment armour = new Armour();
  10. armour.playerBuyEquipment(malePlayer);
  11. armour.playerBuyEquipment(femalePlayer);
  12. }
  13. }

Result

  1. 男性玩家购买武器装备!
  2. 女性玩家购买武器装备!
  3. 男性玩家购买铠甲装备!
  4. 女性玩家购买铠甲装备!
 
 

GoF23种设计模式之结构型模式之桥接模式的更多相关文章

  1. GoF23种设计模式之结构型模式之组合模式

    一.概述 将对象组合成树型结构以表示“部分--整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分--整体层次结构的时候. 2.你希望用户忽略组 ...

  2. GoF23种设计模式之结构型模式之外观模式

    一.概述         为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...

  3. GoF23种设计模式之结构型模式之代理模式

    一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表. 2.虚代理(VirtualProxy):根据需要 ...

  4. GoF23种设计模式之结构型模式之享元模式

    一.概述  运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...

  5. GoF23种设计模式之结构型模式之适配器模式

    一.概述         将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...

  6. GoF23种设计模式之结构型模式之装饰模式

    一.概述 动态地给一个对象添加一些额外的职责.装饰模式比生成子类更为灵活. 二.适用性 1.在不影响其他对象的情况下,以动态.透明的方式给但个对象添加职责. 2.处理那些可以撤销的职责. 3.当不能采 ...

  7. Go语言实现的23种设计模式之结构型模式

    摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...

  8. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  9. GoF的23种设计模式之结构型模式的特点和分类

    结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...

随机推荐

  1. 图片的回显。js

    l  <tr><td></td> <td> <c:if test="${editVo.pic!=''}"><img ...

  2. js 提示样式 ? 上写提示内容

    //再需要的地方放入 <img dms_map_key="zs_prise" src="${ctx }/static/image/tip.png" cla ...

  3. java获得文件扩展名

    java获得文件扩展名: public static void main(String[] args) throws Exception { String name = ""; S ...

  4. ActionListener 监听事件源产生的事件

    用户在窗体上对组件进行一定动作,比如鼠标点击,会产生一些相应的事件,如ActionEvents,ChangeEvents,ItemEvents等,来响应用户的鼠标点击行为.通过实现ActionList ...

  5. iOS-加载数据的实现-MJRefresh

    使用CocoaPods加载三方库: pod 'MJRefresh' MJRefresh类结构图: 具体实现方法和效果图: The drop-down refresh 01-Default self.t ...

  6. oracle最高账号sys的密码认证模式

    CONNECT USERNAME/PASSWORD@SERVERNAME AS SYSDBAconnect 是指连接到username是指用户名password是指密码servername是指服务名a ...

  7. pat甲级1044二分查找

    1044 Shopping in Mars(25 分) Shopping in Mars is quite a different experience. The Mars people pay by ...

  8. jQuery中常用的元素查找方法总结

    $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div&q ...

  9. SQL Server Profiler查询跟踪的简单使用

    1.打开SQL Server Management Studio,选择工具->SQL Server Profiler,或者直接从路径:开始/程序/Microsoft SQL Server 200 ...

  10. Spring,FetchType.LAZY和FetchType.EAGER什么区别?

    1.FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载. 2.FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载. ...