抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

适配器模式是作为两个不兼容的接口之间的桥梁,能解决接口不兼容问题。

库适配器

对于各种请求库,如fetch API、axios、jquery,其各种请求方法的写法都不一样,如何统一它们,让写出的代码更具有灵活性?那就要用到适配器模式了,这里我写一个简单的requestAdapter。

const requestAdapter = function(){
    this.instance = axios.create({
        baseURL: '',
        timeout: 10000,
        headers: {}
    });
    this.printlog = false
    // 添加请求拦截器
    this.instance.interceptors.request.use((config)=> {
        // 在发送请求之前做些什么
        console.log(this.printlog)

        this.printlog && (function(){
            console.log("开始请求啦!")
            console.log("请求配置:",config)
        })()            
        return config;
    },  (error) =>{
        // 对请求错误做些什么
        this.printlog && (function(){
            console.log("请求失败咯~")
            console.log("请检查:",error)
        })()
        return Promise.reject(error);
    });

    // 添加响应拦截器
    this.instance.interceptors.response.use( (response)=> {
        // 对响应数据做点什么
        this.printlog && (function(){
            console.log("收到响应:")
            console.log(response)
        })()
        return response;
    },  (error)=> {
        // 对响应错误做点什么
        this.printlog && (function(){
            console.log("请求失败咯~")
            console.log("请检查:",error)
        })()
        return Promise.reject(error);
    });
};
requestAdapter.prototype.get = function({url,params}){
    return this.instance.get(url,{
        params
    })
}
requestAdapter.prototype.setPrintlog = function(flag = true){
    if(!(typeof flag === "boolean")) throw new Error("flag接受一个布尔型参数")
    this.printlog = flag

}
const request = new requestAdapter();
request.setPrintlog(true)
request.get({
    url:"/",
    params :{name:1}
})

测试如图:

这样,就可以制作出一个属于自己的请求库,假如某天axios不再是主流的时候,直接改写自己库里的get代码就好了。

参数适配器

其实上面的get参数就已经有参数适配器的雏形了。

假如我们碰到很多参数的时候,如:

function updateUser(name,age,father,mother,sex){ /* ... */ }

这样写的话,不仅顺序上需要记住,还要确保参数完整,那么可以使用适配器进行优化:

function updateUser(user){
    let _adapter = {
        name:'sunzehui',
        age:20,
        father:'sun',
        mother:'sun',
        sex:1
    }
    for(const key in _adapter){
        _adapter[key] = user[key] || _adapter[key]
    }
    // do something ...
}

数据结构适配

有一次我要保证每个数据都不能重复,数据是对象,自然用不了set了,for循环挨个查又感觉太low了,记得有个数据结构是map,可以保证key唯一,具体实现:

function dataAdapter(list){
    let ret = {};
    for(const obj of list){
        ret[obj.name] = obj.value
    }
    return ret;
}
const list = [
    {name:'sunzehui',value:1},
    {name:'wangdefa',value:2},
    {name:'wangnima',value:1},
    {name:'sunzehui',value:3},
]
console.log(JSON.stringify(dataAdapter(list),2,null));
/*
output:
{"sunzehui":3,"wangdefa":2,"wangnima":1}
*/

评论