JAVA设计模式-适配器模式

目录

1、基本定义

2、工作原理

3、类适配器模式

4、对象适配器模式

5、接口适配器模式


1、基本定义

1.1、适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原币因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器

1.2、适配器模式属于结构性模式

1.3、主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

2、工作原理

2.1、适配器模式:将一个类的接口转换成另一种接口。让原本接口不兼容的类可以兼容

2.2、从用户的角度看不到被适配这,是解耦的

2.3、用户调用适配器转换出来的目标接口发,适配器再调用被适配者的相关接口方法

2.4、用户收到反馈结果,感觉只是和目标接口交换

JAVA设计模式-适配器模式_第1张图片

 

3、类适配器模式

3.1、基本介绍:Adapter类,通过继承src类,实现dst类接口,完成src->dst的适配

3.2、例子

以生活中充电器的例子来讲解适配器,充电器本身相当于 Adapter 220V 交流电
相当于 src ( 即被适配者 ) ,我们的目 dst( 即 目标 ) 5V 直流电
JAVA设计模式-适配器模式_第2张图片

 

/**适配的接口
 * @author chenbiao
 * @Data 2022/10/10 11:40 PM
 */
public interface IVoltage5V {
    public int output5V();
}
public class Voltage220V {

    public int output220V(){
        int src=220;
        System.out.println("电压="+src+"符");
        return src;
    }

}
/**
 * 适配器模式就是 要么继承或者实现一个抽象(源) ,再实现 或者继承(目标源)
 * @author chenbiao
 * @Data 2022/10/10 11:41 PM
 */
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
    @Override
    public int output5V() {
        int src = output220V();
        int dstV=src/44;
        return dstV;
    }
}
public class Phone {

    public void charging(IVoltage5V iVoltage5V){
        if(iVoltage5V.output5V()==5){
            System.out.println("电压为5V,可以充电");
        }else if(iVoltage5V.output5V()>5){
            System.out.println("电压大于5V,不可以充电");
        }
    }
}
public class Clinet {
    public static void main(String[] args) {
        System.out.println("类适配器模式");
        Phone phone=new Phone();
        phone.charging(new VoltageAdapter());
    }
}

3.3、总结:类适配器需要继承目标类 实现转换的类的方法

3.4、特点

1>JAVA是单继承机制,所以类适配器需要继承src类这是一个缺点。因为这要dst必须是接口,有一定局限性。

2>src类的方法在Adapter中都会暴露出来,也增加了类使用的成本

3>由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了

4、对象适配器模式

1、基本思路和类的适配器模式相同,只是将Adapter类做修改,不是继承src类。而是持有src类的实例,以解决兼容性的问题。即持有src类,实现dst类的接口完成src->dst的适配

2、根据“合成复用原则”,再系统中尽量使用关联关系来代替继承关系

3、对象适配器模式是适配器模式常用的一种

JAVA设计模式-适配器模式_第3张图片

 

public class VoltageAdapter implements IVoltage5V {
    private Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        int dst=0;
        if(null!=voltage220V){
            System.out.println("使用对象适配器转换");
            int src = voltage220V.output220V();
             dst=src/44;
            System.out.println("适配完成 输出电压"+dst);
        }

        return dst;
    }
}
public class Clinet {
    public static void main(String[] args) {
        System.out.println("对象配器模式");
        Phone phone=new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
    }
}

4、总结和类对象基本一致,就是适配器做目标方法的时候改为聚合使用

5、接口适配器模式

5.1、当不需要全部实现接口提供的方法时,可以先设计一个抽象类实现接口,并为该接口中每个放阿飞提供一个默认实现,那么该抽象类的子类可以有选择的覆盖父类的某些方法来实现需求

5.2、适用于一个接口不想使用其所有的方法的情况

JAVA设计模式-适配器模式_第4张图片

public interface Interface4 {
    public void m1();
    public void m2();
    public void m3();
    public void m4();
}
/**
 * 在AbsAdapter 将Interface4的方法进行默认实现
 * @author chenbiao
 * @Data 2022/10/11 12:17 AM
 */
public class AbsAdapter implements Interface4{
    public void m1(){

    }

    public void m2(){

    }

    public void m3(){

    }

    public void m4(){

    }
}

 

public class Clinet {
    public static void main(String[] args) {
        AbsAdapter adapter = new AbsAdapter() {
            @Override
            public void m1() {
                System.out.println("使用了m1的方法");
                super.m1();
            }
        };
        adapter.m1();
    }
}

5.3、总结:不直接实现方法,而是抽象类先实现所有的接口方法。客户端通过匿名内部类实现具体自己需要的方法。

你可能感兴趣的:(原理,java,设计模式,适配器模式)