zoukankan      html  css  js  c++  java
  • 适配器模式

    适配器模式

    适配器模式的作用是解决两个软件实体间的不兼容问题。使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作。适配器的别名是包装器(wrapper),这是一个相对简单的模式。在程序开发种有许多这样的场景:当试图调用没款或者对象的某个接口时,却发现这个接口的格式并不符和目前的需求。这个时候有两种解决办法,第一种时修改原来的接口实现,但如果原来的模块很复杂,或者拿到的模块是别人编写的经过压缩的代码,修改原接口就显得不太显示了。第二种办法是创建一个适配器,将原接口转换为客户希望的另一个接口,客户只需要和适配器打交道。

    适配器有4种角色:

    • 目标抽象角色(Target)
    • 源角色(Adaptee)
    • 适配器角色(Adapter)
    • 客户端(client)

    简单的适配器模式

    比如之前我们项目中都是用的axios进行ajax请求,现在我们想改成fly请求,项目中请求ajax的地方必然很多,我们替换axios的时候一个一个替换的话会非常麻烦,那怎么办呢?这个时候我们可以增加一个适配器:

        let axios = {
            get(url){
                return fly.get(url)
            },
            post(url,data){
                return fly.post(url,data)
            }
        }
        axios.get('xxx');
        axios.post('xxx',{name:'11'})
    

    我们现在有一个这样的需求:

    在以前的电脑上,PS2接口是连接鼠标、键盘等其他外部设备的标准接口。但随着技术的发展,越来越多的电脑开始放弃了PS2接口,转而仅支持USB接口。所以那些过去生产出来的只拥有PS2接口的鼠标、键盘、游戏手柄等,需要一个USB转接口才能继续正常工作,这是PS2-USB适配器诞生的原因

    // 计算机
        class Computers{
            constructor(type) {
                this._type = type;
            }
            connect() {
                if(this._type == 'usb'){
                    console.log('连接成功')
                }else{
                    console.log('连接失败,只能使用usb连接')
                }
            }
            getType() {
                return this._type;
            }
        }
        // ps2接口
        class Ps2 {
            _type = 'ps2'
        }
        // usb接口
        class Usb{
            _type = 'usb'
        }
        let ps2 = new Ps2();
        let computers = new Computers(ps2._type);
        console.log(computers.getType()) // ps2
        computers.connect(); // 连接失败,只能使用usb连接 
        let usb = new Usb();
        let computers1 = new Computers(usb._type);
        console.log(computers1.getType()); // usb
        computers1.connect(); // 连接成功
    

    上面代码中,我们定义了两个源角色Ps2Usb,还有一个目标抽象角色Computers,但是我们的计算机只支持usb接口,是无法连接ps2的,所以我们现在需要一个转接头,也就是适配器

    // 计算机
        class Computers{
            constructor(type) {
                this._type = type;
                this._port = 'usb'
            }
            connect() {
                if(this._type == this._port){
                    console.log('连接成功')
                }else{
                    console.log('连接失败,只能使用usb连接')
                }
            }
            getType() {
                return this._type;
            }
        }
        // 适配器
        class Adapter extends Computers{
            constructor(type) {
                super()
                this._type = type;
                this.transform()
            }
            getType() {
                return this._type;
            }
            transform(){
                if(this._type === this._port){
                    return this._type;
                }else {
                    return this._port;
                }
            }
        }
        // ps2接口
        class Ps2{
            constructor() {
                this.__proto__ = new Adapter('usb') 
            }
        }
        // usb接口
        class Usb{
            constructor() {
                this.__proto__ = new Adapter('usb') 
            }
        }
        let computers = new Computers(new Ps2().transform());
        console.log(computers.getType()) // usb
        computers.connect(); // 连接成功
        let computers1 = new Computers(new Usb().transform());
        console.log(computers1.getType()); // usb
        computers1.connect(); // 连接成功
    
  • 相关阅读:
    Seaslog高性能日志系统学习
    同步、异步与阻塞、非阻塞、协程
    SQL常用增删改查语句
    js里的document对象大全(DOM操作)
    php的cURL资源的初步使用
    hive学习笔记(初级)
    使用NSIS制作可执行程序的安装包
    C#设置一个控件可以鼠标拖动
    C#画图超出屏幕的部分无法显示的解决方法
    C#获取当前不同网卡对应的iP
  • 原文地址:https://www.cnblogs.com/mengxiangji/p/11011886.html
Copyright © 2011-2022 走看看