java设计模式之适配器设计模式

一 为什么有适配器(根本原因:事情不是一个独立单元做的)

  1. 假如在现实社会中你是一个工人,需要做一个鼠标,然后你又需要做一个主板,这个时候如果需要再做个鼠标与主板的适配接口的话,老板绝对会找你pk的。
  2. 所有的适配器应该出现的地方都是在事情不是一个独立单元设计的,而这个时候要进行对接(例如:ps2的鼠标要插上电脑主板,对电脑的功能进行调用),这个时候才会需要一个适配器。
  3. 有时候把所有东西拆分开来都可以看到适配器的影子,比如手机充电=220电源+充电头+充电线+手机,这样充电头和充电线就都是适配器了。我们这里的独立单元就是看事情的角度了!

二 适配器的特点

2.1,不能独立使用,必须配合两个端来使用

2.2,解耦

    例如;充电头+数据线+手机 把不同的独立的功能都提取出来 

2.3,复用性

    数据线还可以当充电线使,当然还可以更换单个部件

2. 4,局限性

    比如充电线只有充电的功能没有数据传输的功能,但是手机和电脑都有数据传输的功能

三 适配器怎么用

3.1,类适配器

直接上代码
// 电脑usb服务 被适配者
class ComputerUSB {

    public void 充电() {
        System.out.println("充电");
    }
    public void 数据传输() {
        System.out.println("数据传输");
    }
    public void 音乐输出() {
        System.out.println("音乐输出");
    }
    public void 音乐输入() {
        System.out.println("音乐输入");
    }
}
//手机数线线
interface PhoneDataLine {

    void 充电数据传输();
}
//客户端普通实现类
class PhoneDataLineImpl implements PhoneDataLine {

    @Override
    public void 充电数据传输() {
        System.out.println("做梦吧,拿什么传");
    }
}
//适配器
class Adaptor extends ComputerUSB implements PhoneDataLine {

    @Override
    public void 充电数据传输() {
        数据传输();
        充电();
    }
}
//客户端
public static void main(String[] args) {

        //普通的接口实现,功能无法使用
        PhoneDataLine dataLine = new PhoneDataLineImpl();
        dataLine.充电数据传输();
        System.out.println("=================可爱的分割线====================");  
        // 适配电脑的接口实现,可以使用功能
        PhoneDataLine phoneDataLine = new Adaptor();
        phoneDataLine.充电数据传输();
}

// output
做梦吧,拿什么传
=================可爱的分割线====================
数据传输

特点

直接继承

3.2 ,使用对象适配

只需要更改适配器的代码就可以了

class Adaptor  implements PhoneDataLine {

    private ComputerUSB computerUSB = new ComputerUSB();
    @Override
    public void 充电数据传输() {
        computerUSB.数据传输();
        computerUSB.充电();
    }
}

3.3 缺省适配器

interface BadPersion {

    void 抽烟();

    void 喝酒();

    void 赌博();

    void 嫖娼();

}

abstract class  BadpersionAdaptor implements BadPersion {

    @Override
    public void 抽烟() {

    }

    @Override
    public void 喝酒() {

    }

    @Override
    public void 赌博() {

    }

    @Override
    public void 嫖娼() {

    }
}

class 周恩来 extends BadpersionAdaptor{

    @Override
    public void 抽烟() {
        super.抽烟();
    }
}

四 小结

三种适配器的相同点和不同点

4.1 相同点

实现了接口,对方法进行了处理

类适配器和对象适配器,都引入了被适配者

4.2 不同点

1,缺省适配器不用引入被适配者
2,类适配器需要继承类,只能适配一个,可以重写被适配者的方法
3,对象适配器可以适配多个(更灵活一点)
4,缺省适配器一般也是抽象类

五 最佳实践

springmvc中的适配器,叫做 handlerAdaptor,这个适配器有很多实现,用户只需要根据自己的需要找到合适的适配器。

问题

如果把类适配器和对象适配器组合起来,请问这个叫什么适配器

本猿菜猿一个,如果有不对的地方,请指出来,本猿会非常乐意接受批评!!

你可能感兴趣的:(java)