1. 适配器模式的定义
适配器模式的作用是解决两个软件实体间的接口不兼容的问题。使用适配器模式之后,原本 由于接口不兼容而不能工作的两个软件实体可以一起工作。
class Power{
charge() {
return '220V';
}
}
class Adapter{
constructor() {
this.power=new Power();
}
charge() {
let power=this.power.charge();
return `${power} => 12V`;
}
}
class Client{
constructor() {
this.adapter=new Adapter();
}
use() {
console.log(this.adapter.charge());
}
}
new Client().use();
2. 场景
2.1 插件适配
function ajax(options){
let _default = {
method:'GET',
dataType:'json'
}
for(let attr in options){
_default[attr] = options[attr]||_default[attr];
}
}
function get(url){
let options = {method:'GET',url};
ajax(options);
}
2.2 promisify
function promisify(readFile) {
return function (...args) {
return new Promise(function (resolve, reject) {
readFile(...args, function (err, data) {
if (err)
reject(err);
else
resolve(data);
})
});
}
}
2.3 computed
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="https://cdn.bootcss.com/vue/2.5.17/vue.js"></script>
<title>vue</title>
</head>
<body>
<div id="root">
<p>{{name}}</p>
<p>{{upperName}}</p>
</div>
<script>
let vm = new Vue({
el: '#root',
data: {
name:'zfpx'
},
computed: {
upperName() {
return this.name.toUpperCase();
}
}
});
</script>
</body>
</html>
3. 总结
有一些模式跟适配器模式的 结构非常相似,比如装饰者模式、代理模式和外观模式。这几种模式都属于“包 装模式”,都是由一个对象来包装另一个对象。区别它们的关键仍然是模式的意图。
- 适配器模式主要用来解决两个已有接口之间不匹配的问题,它不考虑这些接口是怎样实 现的,也不考虑它们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够 使它们协同作用。
- 装饰者模式和代理模式也不会改变原有对象的接口,但装饰者模式的作用是为了给对象 增加功能。装饰者模式常常形成一条长的装饰链,而适配器模式通常只包装一次。代理 模式是为了控制对对象的访问,通常也只包装一次。
- 外观模式的作用倒是和适配器比较相似,有人把外观模式看成一组对象的适配器,但外 观模式最显著的特点是定义了一个新的接口。