失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 23种经典设计模式的java实现_3_桥接模式

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

时间:2018-07-21 10:18:50

相关推荐

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@">huqi</a>

* @serialData

*/

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@">huqi</a>

* @serialData

*/

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@">huqi</a>

* @serialData

*/

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@">huqi</a>

* @serialData

*/

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@">huqi</a>

* @serialData

*/

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 ===");

}

}

你还等什么呢?复制下来运行它试试看吧——如果你还对“桥接”模式不了解的话。

如果觉得《23种经典设计模式的java实现_3_桥接模式》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。