设计模式-08-桥接模式
个人github地址:HibisciDai
设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai
processon在线UML类图:processon
[TOC]
设计模式-08-桥接模式 桥接模式(Bridge Pattern) 意图 把抽象化与实现化解耦,提供两者之间的桥接结构,使二者可以独立变化。
The bridge pattern is a design parrern used in software engineering which is meant to “decouple on abstraction from its implement so that the two can vary independently”
主要解决 继承类爆炸。
何时使用 实现系统可能有多个角度分类,每一种角度都可能变化。
关键代码 抽象类依赖实现类。
如何解决 涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可能被结构化改变而不影响结果。
应用实例 墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。
优点
抽象和实现的分离。
优秀的扩展能力。
实现细节对客户透明。
缺点 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
使用场景
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
注意事项 两个独立变化的维度最适合桥接模式。
案例1 铅笔和画。
类图
代码 pattern08.bridge.demo1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 public abstract class Color { abstract void getColor () ; } public class Blue extends Color { @Override void getColor () { System.out.println("蓝色" ); } } public class Red extends Color { @Override void getColor () { System.out.println("红色" ); } } public abstract class PaintBrush { Color c; public PaintBrush (Color c) { super (); this .c = c; } abstract void draw () ; } public class ThickBrush extends PaintBrush { public ThickBrush (Color c) { super (c); } @Override void draw () { c.getColor(); System.out.println("浓刷" ); } } public class ThinBrush extends PaintBrush { public ThinBrush (Color c) { super (c); } @Override void draw () { c.getColor(); System.out.println("细刷" ); } }
测试输出 1 2 3 4 5 6 public class Main { public static void main (String[] args) { PaintBrush pb = new ThickBrush (new Blue ()); pb.draw(); } }
案例2 类图 原类图:
修改后:
代码 pattern08.bridge.demo2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 public abstract class Image { abstract void getImage () ; } public class GIFImage extends Image { @Override void getImage () { System.out.println("GIFImages" ); } } public class JPGImage extends Image { @Override void getImage () { System.out.println("JPGImage" ); } } public class PNGImage extends Image { @Override void getImage () { System.out.println("PNGImage" ); } } public class BMPImage extends Image { @Override void getImage () { System.out.println("BMPImage" ); } } public abstract class OperationSystemImage { Image i; public OperationSystemImage (Image i) { super (); this .i = i; } abstract void show () ; } public class LinuxOSImage extends OperationSystemImage { public LinuxOSImage (Image i) { super (i); } @Override void show () { System.out.println("LinuxOSImage" ); i.getImage(); } } public class WinOSImage extends OperationSystemImage { public WinOSImage (Image i) { super (i); } @Override void show () { System.out.println("WinOSImage" ); i.getImage(); } } public class UniOSImgae extends OperationSystemImage { public UniOSImgae (Image i) { super (i); } @Override void show () { System.out.println("UniOSImgae" ); i.getImage(); } }
测试输出 1 2 3 4 5 6 7 8 public class Main { public static void main (String[] args) { OperationSystemImage i1 = new LinuxOSImage (new GIFImage ()); i1.show(); OperationSystemImage i2 = new WinOSImage (new PNGImage ()); i2.show(); } }
1 2 3 4 LinuxOSImage GIFImages WinOSImage PNGImage