GoF定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
这应该是对面向接口和面对对象编程很好的解释了。比如,不管应用怎样变化,只要接口不变,那么系统就比较容易应对变化;只要基础(抽象)类定义得扎实合理,系统就可以呈现比较稳定的特征。
PHP代码演示:
输出:
启动A应用
启动B应用
不管应用A和应用B怎样变化,比如升级或者其他改动,接口不会变,那么系统不受影响。
上面是面向接口编程,面向对象编程也是体现在基础类的定义上。
输出:
启动A应用 执行A的功能func1
启动B应用 执行B的功能func2
其实,只要含义明确,也可以有其他编码样式的变化。
输出:
基础类的初始化 启动A应用 A的功能
基础类的初始化 启动B应用 B的功能
这个设计模式在很多地方都有应用,比如应用安装、事件挂载等。
比如应用安装和使用的编码可以这样写:
输出:
当前注册的应用列表
appA
appC
启动A应用
启动C应用
在消息队列里的注册和使用也是一个道理,只是在事件循环上做处理。
JavaScript代码演示:
设计模式之桥接模式
function app(Name){
this.Name=Name;
this.start=function(){
PrintInfo(this.Name+"启动");
}
}
function Bridge(){
this.App=null;
this.SetCurrentApp=function(Obj){
this.App=Obj;
};
this.start=function(){
this.App.start();
}
}
function PrintInfo(Str){
document.getElementById("demo").innerHTML = document.getElementById("demo").innerHTML + Str+"";
}
let AppA=new app("应用A");
let AppC=new app("应用C");
let B=new Bridge();
B.SetCurrentApp(AppA);
B.start();
B.SetCurrentApp(AppC);
B.start();
输出:
应用A启动
应用C启动
2022年6月19日第一次更新。