一、概述
        将类的抽象部分与实现分部分离开来,使它们都可以独立地变化。
二、适用性
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. 女性玩家购买铠甲装备!
 
 

最新文章

  1. libCURL开源库在VS2010环境下编译安装,配置详解
  2. Java Web应用的开发环境配置
  3. acm入门编成题
  4. expect工具的简单用法
  5. ubuntu更换源后报错:W: GPG error: (转载)
  6. Parallel.ForEach , ThreadPool.QueueUserWorkItem
  7. hdoj 2087 剪花布条
  8. 8.2.1.5 Engine Condition Pushdown Optimization 引擎条件下推优化
  9. Solr学习(2) Solr4.2.0+IK Analyzer 2012
  10. 【总结】AngularJs学习总结
  11. spring boot jsp页面
  12. 一个非常简单的IMPDP事儿
  13. linux命令之:yum
  14. 20172327 2018-2019-1 《第一行代码Android》第一章学习总结
  15. java协变逆变,PECS
  16. how to fix bug in daily work
  17. 使用shake.js让你博客支持摇一摇
  18. 【持续更新】一个简洁、易用的美赛LaTeX模板: easyMCM
  19. Linux vi命令大全
  20. ios 利用UIScrollView实现图片缩放

热门文章

  1. 【密码学】Https握手协议以及证书认证
  2. vnc安装问题
  3. onclientclick与onclick的问题.
  4. Java基础重点指南
  5. [备忘]java 静态块、非静态块、静态函数、构造函数 执行顺序
  6. 在Magento System Configuration页面添加配置项
  7. 功放TAS5719耳机POP noise分析 对策
  8. ArcGIS API for JavaScript开发初探——基础知识
  9. 《Python高效开发实战》实战演练——建立应用2
  10. 【MATLAB】画平行于坐标轴的曲线