设计模式 -- 桥接模式

2019-07-25  本文已影响0人  皆为序幕_

场景

某公司准备开发一个跨平台图像浏览系统,要求可以显示JPG、PNG等多种格式图片,并且能够在Windows、Linux等多个操作系统上运行

示例类图

使用了一种多层继承结构,Image是抽象父类,而JPGImage、PNGImage等作为其直接子类,由于每一种图像在不同的操作系统的屏幕上显示有所差异,因此需要为不同的图像类再提供一组在不同操作系统显示的子类,JPGImage提供子类JPGWindows、JPGLinux,分别用于在Windows、Linux不同的操作系统下显示图像

问题来了
由于采用多层继承结构,系统扩展非常麻烦,无论是增加新的图像格式还是增加新的操作系统,都需要增加大量的具体类,这将导致系统变得非常庞大,增加运行和维护开销

问题改进
将图像格式与操作系统两个维度分离,使得它们可以独立变化,增加新的图像文件格式或者操作系统时都对另一个维度不造成任何影响

示例类图(改进)

表述 (结构型模式)

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

如果软件系统中某个类存在俩个或多个维度变化,通过该模式可以将这俩个维度分离出来,使两者可以独立发展,与多继承方案不同,它将俩个独立变化的维度设计为俩个独立的继承等级结构,并且在抽象层建立一个抽象关联

桥接模式类图

桥接模式类图

优点

缺点

使用场景

示例

需求V1:某公司准备开发一个跨平台图像浏览系统,要求可以显示JPG、PNG等多种格式图片,并且能够在Windows、Linux等多个操作系统上运行

class Image {
    var system : System
    var format : String
    init(system:System,format:String) {
        self.system = system
        self.format = format
    }
    func parseFile() {
        self.system.show(format: self.format)
    }
}

class JPGImage : Image {
    
}

class PNGImage: Image {
    
}

class System {
    func show(format:String) {
        
    }
}
class WindowsSystem : System {
    override func show(format:String) {
        print("\(format)格式在windows系统下显示")
    }
}

class LinuxSystem : System {
    override func show(format:String) {
        print("\(format)格式在Linux系统下显示")
    }
}

客户端调用:

let win = WindowsSystem()
let lin = LinuxSystem()
let jpgSys = JPGImage.init(system: win, format: "jpg" )
jpgSys.parseFile()
let jpgLin = JPGImage.init(system: lin, format: "jpg" )
jpgLin.parseFile()

let pngSys = PNGImage.init(system: win, format: "png")
pngSys.parseFile()
let pngLin = PNGImage.init(system: lin, format: "png")
pngLin.parseFile()

log:
jpg格式在windows系统下显示
jpg格式在Linux系统下显示
png格式在windows系统下显示
png格式在Linux系统下显示

需求V2:增加新的图像文件格式TIF

只需要创建TIFImage继承自Image即可

class TIFImage : Image {
    
}

//客户端:
let tifSys = PNGImage.init(system: win, format: "tif")
tifSys.parseFile()
let tifLin = PNGImage.init(system: lin, format: "tif")
tifLin.parseFile()
tif格式在windows系统下显示
tif格式在Linux系统下显示

需求V2:增加一个新的操作系统Mac OS

只需要创建MacOSSystem继承自System即可

class MacOSSystem : System {
    override func show(format:String) {
        print("\(format)格式在Mac OS系统下显示")
    }
}

//客户端:
let mac = MacOSSystem()
let jpgMac = JPGImage.init(system: mac, format: "jpg")
jpgMac.parseFile()
let pngMac = PNGImage.init(system: mac, format: "png")
pngMac.parseFile()
let tifMac = JPGImage.init(system: mac, format: "tif")
tifMac.parseFile()

log:
jpg格式在Mac OS系统下显示
png格式在Mac OS系统下显示
tif格式在Mac OS系统下显示
上一篇 下一篇

猜你喜欢

热点阅读