桥接模式的适用:
你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如:程序的实现部分在运行时需要被选择或者切换。
类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
对一个抽象实现的修改需要对客户不产生影响,即客户的代码不必重新编译。
有许多类要生成。这种情况下你必须将一个对象分解成两个部分。这种类层次结构为“嵌套的普化”。
你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
示例说明:
接口IText定义了字体的最终展现,但其的具体实现TextImpLinux和TextImpMac并不用作对外使用(即向客户暴露)。
那么,我们使用抽象类AbstractText对IText的具体实现进行“桥接”,即在这两个真实的实现和最终对外使用的字体类TextBold和TextItalic之间建造了一座桥梁,这座桥梁是通过TextBold和TextItalic继承抽象类AbstractText实现的。
最终,结果就是,字体具有了新的特性Bold和Italic但又不失自己的基本属性Linux和Mac。
这就是我们想要的。
字体接口及其两个基本实现——具有Linux风格或Mac风格的字体:
package com.alex.designpattern.bridge;
/** *//**
 * @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
public interface IText ...{
    public void DrawTextImp();
}
package com.alex.designpattern.bridge;
/** *//**
 * The ConcreteImplementor
 */
public class TextImpLinux implements IText ...{
    public void DrawTextImp() ...{
        System.out.println("The text has a Linux style.");
    }
}
package com.alex.designpattern.bridge;
/** *//**
 * The ConcreteImplementor
 */
public class TextImpMac implements IText ...{
    public void DrawTextImp() ...{
        System.out.println("The text has a Mac style.");
    }
}
 这个抽象类可以看作是一个桥梁,它被用来“桥接”字体的基本实现与字体的附加特性,使字体的属性得到无绑定的扩充:
package com.alex.designpattern.bridge;
/** *//**
 * The Abstract of Text<br>
 * Set the Text's System Style
 * <p>
 * This abstract class is a bridge,<br>
 * it can bridge "System Style" to real implemention "Text Style" of IText.
 *
 * @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
public abstract class AbstractText ...{
    public abstract void DrawText(String text);
protected IText GetTextImp(String type) ...{
        if (type.equals("Mac")) ...{
            return new TextImpMac();
        } else if (type.equals("Linux")) ...{
            return new TextImpLinux();
        } else ...{
            return new TextImpMac();
        }
    }
}
那么,以下就是字体的附加特性——粗体和斜体,它们通过实现抽象类AbstractText来与基本属性的实现结合:
package com.alex.designpattern.bridge;
/** *//**
 * The RefinedAbstraction
 *
 * @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
public class TextBold extends AbstractText ...{
    private IText imp;
public TextBold(String type) ...{
        imp = GetTextImp(type);
    }
public void DrawText(String text) ...{
        System.out.println(text);
        System.out.println("The text is bold text.");
        imp.DrawTextImp();
    }
}
package com.alex.designpattern.bridge;
/** *//**
 * The RefinedAbstraction
 *
 * @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
public class TextItalic extends AbstractText ...{
    private IText imp;
public TextItalic(String type) ...{
        imp = GetTextImp(type);
    }
public void DrawText(String text) ...{
        System.out.println(text);
        System.out.println("The text is italic text.");
        imp.DrawTextImp();
    }
}
最后,当然是测试启动类啦,通过可以测试我们对这个模式的实现:
package com.alex.designpattern.bridge;
/** *//**
 * 桥接模式
 * <p>
 * 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
 *
 * @author <a href="huqimailto:huqiyes@gmail.com">huqi</a>
 * @serialData 2007
 */
public class Test ...{
public static void main(String[] args) ...{
        AbstractText myText = new TextBold("Mac");
        myText.DrawText("=== A test String ===");
System.out.println("------------------------------------------");
myText = new TextBold("Linux");
        myText.DrawText("=== A test String ===");
System.out.println("------------------------------------------");
myText = new TextItalic("Mac");
        myText.DrawText("=== A test String ===");
System.out.println("------------------------------------------");
myText = new TextItalic("Linux");
        myText.DrawText("=== A test String ===");
    }
}
你还等什么呢?复制下来运行它试试看吧——如果你还对“桥接”模式不了解的话。
 

转载于:https://blog.51cto.com/huqicto/280902

23种经典设计模式的java实现_3_桥接模式相关推荐

  1. [转]23种经典设计模式的java实现_5_职责链模式

    对于职责链模式,一般是这么定义的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,即--将这些对象连成一条(处理)链,并沿着这条链传递该请求,直到这条链结束同时有一个对象处理它 ...

  2. 23种经典设计模式的java实现_5_职责链模式

    对于职责链模式,一般是这么定义的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,即--将这些对象连成一条(处理)链,并沿着这条链传递该请求,直到这条链结束同时有一个对象处理它 ...

  3. 23种经典设计模式都有哪些,如何分类?Java设计模式相关面试

    23种经典设计模式都有哪些,如何分类? 23种经典设计模式都有哪些,如何分类? java常用的设计模式?说明工厂模式 Java 中的23 种设计模式: Factory(工厂模式), Builder(建 ...

  4. 设计模式之委派模式(不属于23种经典设计模式之一)

    介绍 标准定义:委派模式的原理为类B和类A是两个互相没有任何关系的类,B具有和A一模一样的方法和属性,并且调用B中的方法.属性就是调用A中同名的方法和属性.B好像就是一个受A授权委托的中介.第三方的代 ...

  5. 23种经典设计模式的原理、背后的思想、应用场景(下)

    对程序员来说,除了算法,设计模式也是提升代码能力的关键技能,今天我就想跟你聊聊 23种经典的设计模式. 23种经典设计模式共分为3种类型,分别是创建型.结构型和行为型.今天,我们把这3种类型分成3个对 ...

  6. C++之23种经典设计模式(一)

    C++之23种经典设计模式(一) C++之23种经典设计模式(一) 单例模式(Singleton) 原型模式(Prototype) 工厂模式(Factory) C++之23种经典设计模式(一) 在偶然 ...

  7. [设计模式] GoF 23种经典设计模式

    原文链接:https://www.yuque.com/cppdev/patterns/zainii 「GOF设计模式」Gang of Four,四人帮.设计模式的经典书籍<设计模式--可复用面向 ...

  8. 一文快速理解23种经典设计模式

    > 对经典的23种设计模式介绍,来判断适合哪种设计模式进行设计 23种设计模式: 第1 部分 适应设计模式   Iterator 模式 迭代器,松耦合 Adapter 模式 适配器模式,使用同样 ...

  9. 在这里23种经典设计模式UML类图汇总

    创建型模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说"来四个鸡翅"就 ...

最新文章

  1. .如何实现浏览器内多个标签页之间的通信?
  2. Spring使用注解配置依赖注入
  3. 1毛钱的CDN你家的网站会用吗?
  4. 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Minimax策略...
  5. 直播 | WWW 2021:基于结构增强文本表示学习的知识图谱补全方法
  6. .NET Core 2.0体验
  7. 设计模式2:工程模式(1)
  8. mysql统计各部门人数_2021各省份电网报名人数统计!会不会比考研还难?有些省份人数还就多的离谱了。。。...
  9. Menelaus定理与证明
  10. [Node.js] node.js入门
  11. vmware的vmnet-概念的解说
  12. 【超详细整理数组基础知识点】(学习笔记8--数组上)
  13. 教你用命令行扩展VHD的大小
  14. Android上传图片的两种方式
  15. matlab imf1,NGPM_v1.4y GA多目标优化的程序 带约束 里面有教程 matlab 272万源代码下载- www.pudn.com...
  16. 二阶系统 matlab,线性二阶系统性能的MATLAB仿真.pdf
  17. 18650锂电池知识全解析
  18. [论文素材]Previous Work----自动仇恨言论检测和冒犯性语言问题
  19. 视频教程-①Spring Cloud 第一季(初级入门篇)-Java
  20. 信息技术教案 计算机病毒,四年级下信息技术教案-计算机病毒知识二辽师大版.docx...

热门文章

  1. 【通知】3月第二周直播预告,模型优化,人脸识别,图像增强核心技术与难题...
  2. 全球及中国彩妆行业渠道模式调研与发展方向分析报告2022版
  3. 全球及中国洗涤剂行业十四五总体规模与盈利状况分析报告2022版
  4. openssl之EVP系列之1---算法封装
  5. 兰州谋定百合品牌-农业大健康·万祥军:功能性农业产业脱贫
  6. CSS响应式:根据分辨率加载不同CSS的几个方法
  7. hashMap和hashTable的区别(个人总结)
  8. Android 中文件类型与MIME的匹配表(转)
  9. C++ primer记录
  10. 博客园北京俱乐部2009年2月28日活动