适配器模式的应用场景:首先不是每个人事先都能想的那么完事;现实生活中也非常见,比如,笔记本自带Usb接口,当时认为这一个就够用了,可是那天客户带了一个TyepC的接口U盘;那么这个笔记本电脑做为一个项目,那么就有点麻烦了。现在我就拿这个做为例子进行说明
场景复现
//Usb 接口
interface Usb{
public void work();
}
//Usb 接口类
class NetBookusb implements Usb{
@Override
public void work() {
System.out.println("Usb working .....");
}
}
主调用
public static void main(String[] args) {
//示例 前期未考虑到Typec接口的情况下项目的代码
Usb u=new NetBookusb();
working(u);
}
//注意这里传参是一个 Usb类的,这个不能变
public static void working(Usb usb){
System.out.println("-------");
usb.work();
System.out.println("---------");
}
但是现在有一个Typec的类
//Typec 接口
interface Typec{
public void Tpcwork();
}
// Typec 继承类
class NetBookTypec implements Typec {
@Override
public void Tpcwork() {
System.out.println("Typec working .....");
}
}
然后为了让它适应程序中的如下
public static void working(Usb usb){
System.out.println("-------");
usb.work();
System.out.println("---------");
}
需要把Usb 做个转换,而这个转换类应该继承Usb类让TypeC做为一个成员;然后在继承的方法重写中调用Typec方法
class Chage implements Usb{
private Typec t;
public Chage(Typec t) {
this.t = t;
}
@Override
public void work() {
t.Tpcwork();
}
}
那么再调用
public class Mtest {
public static void main(String[] args) {
//示例 前期未考虑到Typec接口的情况下项目的代码
Usb u=new NetBookusb();
working(u);
//-------------------------为了适应typc 需要用一个转换类去实现
Typec tc=new NetBookTypec();
Chage ch=new Chage(tc);
working(ch);
}
//注意这里传参是一个 Usb类的,这个不能变
public static void working(Usb usb){
System.out.println("-------");
usb.work();
System.out.println("---------");
}
}
很多人会问,修改一下就完事了为什么搞这么复杂呢!还是那个常谈的问题,对修改关闭,对新增开放,所以在不能修改的情况下去增加功能。
原理非常简单,用一个类去继承老接口,然后在类的内部把新类作为一个成员变量并传进来,在老接口的方法中实现新接口的功能。
另外还有一种情况,我们通常定义一个接口方法过多时,而我们继承的类只需要指定的几个方法就可以了,那么怎么办
interface working{
public void sang();//喝歌
public void codeing();//写代码
public void drive();//开车
}
class It implements working{
@Override//不需要
public void sang() {
}
@Override//这才是需要
public void codeing() {
}
@Override//不需要
public void drive() {
}
}
这个时候我们也需要一个代理类去先去继承接口,然后其它类再去继承这个类;然后再通过重写方法的方式实现。
//1.先定一个中转类 并继承接口
class workingpy implements working{
@Override
public void sang() {
}
@Override
public void codeing() {
}
@Override
public void drive() {
}
}
//2.定义一个类 去继承中转
class It extends workingpy{
//这里通过重写的方式实现
@Override
public void codeing() {
System.out.println("我要写代码");
}
}
完美解决问题。这样就方便多了对吧
因此,适配器可以理解为转换接口