上篇:【学习设计模式9】兼容扩展坞—适配器模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式8】组装流水线——建造者模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式7】复制粘贴就得了——原型模式_Aiky哇的博客-CSDN博客那么有没有一种方法可以名正言顺的复制粘贴呢?当然有了,那就是原型模式。原型模式也叫克隆模式。https://aikysay.blog.csdn.net/article/details/123407658建造者模式的定义建造者模式的使用流程建造者模式的适用场景建造者模式的优缺点参考文献建造者模式(Bulider模式)详解复杂对象的组装与创建...https://aikysay.blog.csdn.net/article/details/124437201
下篇:
【学习设计模式11】树形处理——组合模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式10】分离抽象与实现——桥接模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式9】兼容扩展坞—适配器模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式8】组装流水线——建造者模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式7】复制粘贴就得了——原型模式_Aiky哇的博客-CSDN博客那么有没有一种方法可以名正言顺的复制粘贴呢?当然有了,那就是原型模式。原型模式也叫克隆模式。https://aikysay.blog.csdn.net/article/deta....https://aikysay.blog.csdn.net/article/details/125068519
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
看不懂,是吧,桥接模式的定义比较抽象,比起单例模式啊,原型模式啊那些比较明显的定义来说,桥接模式的定义确实不好理解。
更好理解的说法是,如果实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合。
分析一下角色类:
引用《大话设计模式》里的例子:
现在需要设计一个手机提供商,需要提供小米手机和华为手机两种不同的手机,每种手机需要有两个功能项,游戏功能和通讯录功能。
那么如果不考虑桥接模式,我们按照通常思路来设计:
按照描述来说,必然是这样设计的。
那么如果按照桥接模式来设计:
这样一比较,就可以看出来桥接模式的优点所在了:
使用上面的例子,使用go语言来写一下桥接模式的实现。
// Abstraction:抽象类。
// 手机类,一个方法AddSoft(),负责添加软件
type mobilePhone interface{
isMobilePhone()
AddSoft(Soft)
}
// RefinedAbstraction:扩充抽象类
// 小米手机类
type XiaoMiPhone struct{
softs []Soft
}
func(n *XiaoMiPhone) isMobilePhone(){}
func(n *XiaoMiPhone) AddSoft(soft Soft) {
n.softs=append(n.softs,soft)
}
// 华为手机类
type HuaWeiPhone struct{
softs []Soft
}
func(n *HuaWeiPhone) isMobilePhone(){}
func(n *HuaWeiPhone) AddSoft(soft Soft) {
n.softs=append(n.softs,soft)
}
// Implementor接口
// 软件类,一个方法Run()
type Soft interface{
isSoft()
Run()
}
// ConcreteImplementor:
// 游戏类
type GameSoft struct{
//...
}
func(n *GameSoft) isSoft(){}
func(n *GameSoft) Run(){
fmt.Println("游戏软件开始运行")
}
// 手机通讯录
type MailSoft struct{
//...
}
func(n *MailSoft) isSoft(){}
func(n *MailSoft) Run(){
fmt.Println("通讯软件开始运行")
}
//--------------------------------------
func main(){
var a,b mobilePhone
a = &XiaoMiPhone{}
b = &HuaWeiPhone{}
var soft1,soft2 Soft
soft1 = &GameSoft{}
soft2 = &MailSoft{}
a.AddSoft(soft1)
a.AddSoft(soft2)
b.AddSoft(soft1)
b.AddSoft(soft2)
for _,i:=range a.softs{
i.Run()
}
for _,i:=range b.softs{
i.Run()
}
}
在发现我们需要多角度去分类实现对象,而只用继承会造成大量的类增加,不能满足开放-封闭原则时,就应该要考虑用桥接模式了。
处理多维度变化——桥接模式(二)_LoveLion的博客-CSDN博客_如果系统中存在两个以上的变化维度
Go设计模式(12)-桥接模式_程序员麻辣烫的博客-CSDN博客
处理多维度变化——桥接模式(四)_LoveLion的博客-CSDN博客