橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式洁灵, 可將一個(gè)大類或一系列緊密相關(guān)的類拆分為抽象和實(shí)現(xiàn)兩個(gè)獨(dú)立的層次結(jié)構(gòu), 從而能在開(kāi)發(fā)時(shí)分別使用。
我們定義一個(gè)抽象的圖形接口和一個(gè)圖形管理接口:
protocol Shape {
var shapManager: ShapeManager { get set }
func draw() -> UIImage
}
protocol ShapeManager {
var linecolor: UIColor { get }
var lineWidth: CGFloat { get }
var filecolor: UIColor { get }
}
這個(gè)類又一個(gè)屬性shapManager,用來(lái)管理圖形的一些屬性,有一個(gè)draw方法疤坝,負(fù)責(zé)繪制圖形。
接下來(lái)我們分別實(shí)現(xiàn)正方形和圓形:
class SquerShape: Shape {
init(shapManager: ShapeManager) {
self.shapManager = shapManager
}
var shapManager: ShapeManager
func draw() -> UIImage {
UIGraphicsBeginImageContext(CGSize.init(width: 100, height: 100))
let p = UIBezierPath.init(rect: CGRect.init(x: 25, y: 25, width: 50, height: 50))
p.lineWidth = self.shapManager.lineWidth
self.shapManager.linecolor.setStroke()
self.shapManager.filecolor.setFill()
p.fill()
p.stroke()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
class CircleShape: Shape {
init(shapManager: ShapeManager) {
self.shapManager = shapManager
}
var shapManager: ShapeManager
func draw() -> UIImage {
UIGraphicsBeginImageContext(CGSize.init(width: 100, height: 100))
let p = UIBezierPath.init()
p.addArc(withCenter: CGPoint(x: 50, y: 50), radius: 25, startAngle: 0, endAngle: 360, clockwise: true)
p.lineWidth = self.shapManager.lineWidth
self.shapManager.linecolor.setStroke()
self.shapManager.filecolor.setFill()
p.fill()
p.stroke()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
具體的圖形類在draw方法里根據(jù)shapManager的屬性馆铁,繪制相應(yīng)的圖形并返回跑揉。
接下來(lái)我們我們實(shí)現(xiàn)兩種管理類,分別設(shè)置一下屬性:
class ShapeManager1: ShapeManager {
var linecolor: UIColor
var lineWidth: CGFloat
var filecolor: UIColor
init() {
self.lineWidth = 1
self.linecolor = .red
self.filecolor = .white
}
}
class ShapeManager2: ShapeManager {
var linecolor: UIColor
var lineWidth: CGFloat
var filecolor: UIColor
init() {
self.lineWidth = 3
self.linecolor = .black
self.filecolor = .blue
}
}
最后在客戶端調(diào)用:
let imageView1 = UIImageView.init(image: SquerShape.init(shapManager: ShapeManager1.init()).draw())
let imageView2 = UIImageView.init(image: SquerShape.init(shapManager: ShapeManager2.init()).draw())
let imageView3 = UIImageView.init(image: CircleShape.init(shapManager: ShapeManager1.init()).draw())
let imageView4 = UIImageView.init(image: CircleShape.init(shapManager: ShapeManager2.init()).draw())
let stack = UIStackView.init(arrangedSubviews: [imageView1, imageView2, imageView3, imageView4])
stack.frame = self.view.bounds
stack.alignment = .center
stack.distribution = .equalSpacing
stack.axis = .vertical
self.view.addSubview(stack)
長(zhǎng)成這樣:
這里只有四種圖形,看不出來(lái)橋接模式的好處历谍,假如要增加一種顏色的圖形现拒,我們只用增加一個(gè)ShapeManager類就可以實(shí)現(xiàn),到時(shí)就會(huì)有六種圖形望侈,假如我們有十個(gè)圖形印蔬,配上十種顏色,我們就可以得到100種具體圖形脱衙。我們用20個(gè)類就實(shí)現(xiàn)了100種圖形侥猬,假如用類繼承的方式,我們需要100個(gè)類捐韩。這就是橋接模式的魅力退唠!