基于渡一教育拓哥单例设计模式课程讲解,及大佬文章、个人理解。
应用背景:电脑卡槽只能读取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){
}
}