23种设计模式之适配器模式(对象适配器、类适配器、缺省适配器)

基于渡一教育拓哥单例设计模式课程讲解,及大佬文章、个人理解。

应用背景:电脑卡槽只能读取SD卡,但存在MiniSD卡,设计使不兼容的俩个卡能够协同工作。

SDCard.java

package test;

public interface SDCard {
	//抽象的SD卡
    public void readSDCard();
    public void writeSDCard();
}

KingstonSDCard.java

package test;

public class KingstonSDCard implements SDCard{

    //这是一张真实的SD卡
    public void readSDCard(){
        System.out.println("读取SDCard");
    }
    public void writeSDCard(){
        System.out.println("写入SDCard");
    }
}

MiniSDCard.java

package test;

public interface MiniSDCard {

   //抽象的MiniSD卡
    public void readMini();
    public void writeMini();
}

KingstonMiniSDCard.java

package test;

public class KingstonMiniSDCard implements MiniSDCard{

    //这是一张真实的MiniSD卡
    public void readMini(){
        System.out.println("读取MiniSDCard");
    }
    public void writeMini(){
        System.out.println("写入MiniSDCard");
    }
}

Computer.java

package test;

public class Computer {

    public void readAndWriteSDCard(SDCard SDCard){
        SDCard.readSDCard();
        SDCard.writeSDCard();
    }
}
  • 对象适配器

  • 类适配器

  • 缺省适配器

1.对象适配器

解决方案:设计一个卡套,使其充当一个转换器,插入MiniSD卡。

CoverForMiniSDCard.java

package test;

//适配器(转换器)
//对象适配器模式
//  在适配器的类中(Cover类)存有一个需要转换的真实对象(MiniCard)作为属性
public class CoverForMiniSDCard implements SDCard{
    
    private MiniSDCard miniSDCard;//包含关系
    public CoverForMiniSDCard(MiniSDCard miniSDCard){
        this.miniSDCard = miniSDCard;
    }

    @Override
    public void readSDCard() {
        this.miniSDCard.readMini();
    }
    @Override
    public void writeSDCard() {
        this.miniSDCard.writeMini();
    }

}

TestMain.java

package test;

public class TestMain {

    public static void main(String[] args) {
        
       Computer computer = new Computer();
	   MiniSDCard miniSDCard = new KingstonMiniSDCard();//多态体现
       CoverForMiniSDCard cover = new CoverForMiniSDCard(miniSDCard);
       computer.readAndWriteSDCard(cover);

    }
}

2.类适配器

解决方案:存在一张可折叠的卡,具有小卡的芯片,同时具有大卡的外观。

SpecialMiniSDCard.java

package test;

//类适配器
//适配器类自己就是那个需要转化的对象

public class SpecialMiniSDCard extends KingstonMiniSDCard implements SDCard{

    //这是用来描述特别的小卡(金士顿研发的特别技术)
    //是一张特别的小卡  本质上是一个小卡 具有小卡的芯片(继承过来的)
    //同时这个卡特别    特别体现在可以折叠--->折叠后长得跟大卡一样(遵循规则)
    @Override
    public void readSDCard() {
        this.readMini();
    }
    @Override
    public void writeSDCard() {
        this.writeMini();
    }

}

TestMain.java

package test;

public class TestMain {

    public static void main(String[] args) {
        
        Computer computer = new Computer();
        SDCard special = new SpecialMiniSDCard();
        computer.readAndWriteSDCard(special);

    }
}

3.缺省适配器

解决方案:设计一个USB万能读卡器,电脑都有USB插口,不同的卡继承USB卡实现不同的方法。

USBCardReader.java

package test;

//这个外部转换器
//具体的卡去选择性的挑选 可以重写的方法

public abstract class USBCardReader implements SDCard,MiniSDCard{

    public abstract void readMini() {}
    public abstract void writeMini() {}
    public abstract void readSDCard() {}
    public abstract void writeSDCard() {}
}

Computer.java

package test;

public class Computer {

    public void readAndWriteSDCard(SDCard SDCard){
        SDCard.readSDCard();
        SDCard.writeSDCard();
    }
    public void readAndWriteUSB(USBCardReader usb){

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值