设计模式之结构型模式(二)桥接模式

79 阅读3分钟

1.适配器模式 2.桥接模式 3.组合模式 4.代理模式 5.装饰模式 6.外观模式 7.享元模式

由于学习难度较大 并且相对用途较少 本章不会讲解享元模式

接下来针对以上6种设计模式进行单独讲解

2 桥接模式

2.1 定义

将抽象部分与其实现部分分离,使它们都可以独立地变化

如果系统中某个类存在两个或者多个独立变化的维度,通过该模式可以将这些维度分离出来,使其均可以独立扩展,桥接模式将这些变化设计为独立的继承机构体系,并且在抽象层对这些独立的维度进行关联

举例说明桥接模式用途: 现需要开发一个图片识别的场景,图片格式有PNG,JPG,GIF,需要适配的系统有mac,linux,windows。一般情况下日常设计大概率会是,建立一个抽象image类,PNGIamge,JPGImage,GIFImage继承该抽象image类,之后PNGImage下面三个继承类,分别为WindowsPNGImage,LinuxPNGImage,MacPNGImage,其余JPG,GIF也同样。这样做看似符合规范,但是后面需要增加一个图片的类型或者需要增加一个适配系统,都需要很复杂的创建才能完成。

桥接模式便是为了解决这种问题而产生的一种设计模式

在使用桥接模式的时候,首先需要识别两个独立变化的维度,例如在本例中两个维度分别是图片格式和适配系统

将这两个维度分别设计为独立的继承结构,本例中将图片格式设置为一个独立的继承结构,图片格式有实现类PNGImage,GIFImage,JPGImage.将适配系统设计为一个独立的继承结构,有实现类windows,mac,linux

识别两个维度中一些普通方法和与之关系最密切的维度设计为抽象类,例如本例中图片抽象类可以设计为抽象类。 另一个维度设计为实现类层次结构,本例中适配系统为实现类层次结构

为两个维度建立抽象层,并提供抽象层的耦合关系

2.3 UML图

image.png 从上面UML图中可以看出

Abstracetion作为抽象类,用于定义抽象类的接口,其持有Implementor

RefinedAbstraction扩充由Abstraction定义的接口,是一个具体类。扩充抽象类实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。

Implementor定义实现类的接口

ConcreteImplementor具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现。在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法

2.4 上述案例具体代码实现

// 抽象类 Image 持有操作系统os的实例 作为UML中的Abstraction
public abstract class Image {  
    private OS os;  
    
    public Image(OS os) {  
        this.os = os;  
    }  
    //作为UML中的operation
    public abstract void display();  
    
    public OS getOs() {  
        return os;  
    }  
}  
  
// 具体图片实现类 JpgImage 作为UML中的RefinedAbstraction
public class JPGImage extends Image {  
    public JPGImage(OS os) {  
        super(os);  
    }  
    
    @Override  
    public void display() {  
        System.out.println("Displaying JPG image on " + getOs().getOS());  
    }  
}  
  
// 具体图片实现类 PNGImage  
public class PNGImage extends Image {  
    public PngImage(OS os) {  
        super(os);  
    }  
    
    @Override  
    public void display() {  
        System.out.println("Displaying PNG image on " + getOs().getOS());  
    }  
}  
  
// 具体图片实现类 GIFImage  
public class GIFImage extends Image {  
    public GifImage(OS os) {  
        super(os);  
    }  
    
    @Override  
    public void display() {  
        System.out.println("Displaying GIF image on " + getOs().getOS());  
    }  
}  
  
// 操作系统接口 OS  作为UML中的Implementor
public interface OS {  
    public String getOS();  
}  
  
// 具体操作系统实现类 Windows  
public class Windows implements OS {  
    @Override  
    public String getOS() {  
        return "Windows";  
    }  
}  
  
// 具体操作系统实现类 Linux  
public class Linux implements OS {  
    @Override  
    public String getOS() {  
        return "Linux";  
    }  
}  
  
// 具体操作系统实现类 Mac  
public class Mac implements OS {  
    @Override  
    public String getOS() {  
        return "Mac";  
    }  
}  
//客户端
public class client{
    public static void main(String args[]){
        Os os = new Windows();
        Image image = new JPGImage(os);
        image.display();
    }
}