23种经典设计模式的java实现_3_桥接模式

简介:
桥接模式的适用:
你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如:程序的实现部分在运行时需要被选择或者切换。
类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时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 ===");
    }
}
你还等什么呢?复制下来运行它试试看吧——如果你还对“桥接”模式不了解的话。
 
 
     本文转自胡奇 51CTO博客,原文链接:http://blog.51cto.com/huqicto/280902,如需转载请自行联系原作者


相关文章
|
2天前
|
设计模式
【设计模式系列笔记】桥接模式
桥接模式(Bridge Pattern)是一种结构性设计模式,它将抽象部分与实现部分分离,使它们可以独立变化而互不影响。桥接模式通过组合而不是继承的方式来实现这种分离。
24 6
|
6天前
|
设计模式 算法 Java
Java中的设计模式及其应用
【4月更文挑战第18天】本文介绍了Java设计模式的重要性及分类,包括创建型、结构型和行为型模式。创建型模式如单例、工厂方法用于对象创建;结构型模式如适配器、组合关注对象组合;行为型模式如策略、观察者关注对象交互。文中还举例说明了单例模式在配置管理器中的应用,工厂方法在图形编辑器中的使用,以及策略模式在电商折扣计算中的实践。设计模式能提升代码可读性、可维护性和可扩展性,是Java开发者的必备知识。
|
9天前
|
设计模式 算法 Java
小谈设计模式(30)—Java设计模式总结
小谈设计模式(30)—Java设计模式总结
|
9天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
15 1
|
14天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
14 0
|
15天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
26 4
|
6月前
|
设计模式 安全 Java
JAVA设计模式1:单例模式,确保每个类只能有一个实例
JAVA设计模式1:单例模式,确保每个类只能有一个实例
|
6月前
|
设计模式 存储 安全
【设计模式——学习笔记】23种设计模式——单例模式Singleton(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——单例模式Singleton(原理讲解+应用场景介绍+案例介绍+Java代码实现)
24 0
|
4月前
|
设计模式 Java
Java设计模式【一】:单例模式
Java设计模式【一】:单例模式
26 0
|
1月前
|
设计模式 安全 Java
Java设计模式之单例模式
在软件工程中,单例模式是一种常用的设计模式,其核心目标是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。Java作为一门广泛使用的编程语言,实现单例模式是面试和实际开发中的常见需求。
66 9
Java设计模式之单例模式