适配器模式Adapter Pattern
又称包装器模式Wrapper Pattern
是作为两个接口或对象之间的桥梁,这种类型的设计模式属于结构型模式,它结合了两个独立接口或对象的功能,这种模式负责加入独立的或不兼容的接口与对象,在Js
中通常可以使用适配器模式进行框架的适配、参数的适配以及数据的适配。
在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式,通常情况下,客户端可以通过目标类的接口访问它所提供的服务。有时现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。在这种情况下,现有的接口需要转化为客户类期望的接口,这样保证了对现有类的重用,如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器Adapter
,它所包装的对象就是适配者Adaptee
,即被适配的类。适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说,当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此适配器可以使由于接口不兼容而不能交互的类可以一起工作。
Target
: 目标类。Adapter
: 适配器类。Adaptee
: 适配者类。Client
: 客户类。Java
、C#
等不支持多重继承的语言,类适配器模式一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。class Target {
say(){
console.log("Target say");
}
}
class Adaptee {
say(){
console.log("Adaptee say");
}
}
class Adapter extends Target {
constructor(adaptee) {
super();
this.adaptee = adaptee;
}
say() {
// Use this.adaptee to implement the method in target
console.log("Adaptee to Target say")
}
}
(function(){
var adaptee = new Adaptee();
var adapter=new Adapter(adaptee);
adapter.say(); // Adaptee to Target say
})();
/**
一个例子
原有一个非常类似jQuery的轻量框架要转用jQuery,需要适配接口,假如只有通过id取得元素的方法需要适配
class Target { // 这就是原轻量框架
getElement(id){
return document.getElementById(id);
}
}
var adaptee = $; // 此处Adaptee即jQuery
class Adapter extends Target {
constructor(adaptee) {
super();
this.adaptee = adaptee;
}
getElement(id) {
return this.adaptee(`#${id}`);
}
}
// 之前是使用 Target 对象的实例 target
// 适配之后使用 Adapter 对象的实例 adapter 并可以将 target 指向 adapter
*/
https://github.com/WindrunnerMax/EveryDay
https://segmentfault.com/a/1190000012436538
https://www.runoob.com/design-pattern/adapter-pattern.html
https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。