3-3、Java 适配器模式心得

适配器模式的应用场景:首先不是每个人事先都能想的那么完事;现实生活中也非常见,比如,笔记本自带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("我要写代码");
    }
}

完美解决问题。这样就方便多了对吧
因此,适配器可以理解为转换接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值