设计模式-适配器模式

适配器模式(adapter)主要包含以下角色:

目标(target)接口:当前系统业务所期待的接口.他可以是抽象类或者接口.

适配者(adaptee)类:他是需要被适配的现存组件.

适配器(adapter)类:转换器,通过继承或者引用适配者的对象,把适配者接口转换成目标接口.

1.类适配器模式

 实现方式: 定义一个适配器类来实现当前系统业务接口,同时也继承现有组件库中已经存在的组件


/**
 * 类适配器测试类
 * 以手机type-c接口为例
 * type-c接口的手机都是没有单独的耳机插孔,而是与充电孔集成在一起
 * 我们以前买的圆孔的耳机就没法用了
 * 于是我们需要一种适配器 来适配圆孔的耳机
 *
 * @author Administrator
 */
public class Test {

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        TypeCHeadSet typec = new TypeCHeadSet();
        typec.playMusic();
        // 调用适配器类 在typec手机上使用圆孔耳机
        AdapterClass adapterClass = new AdapterClass();
        adapterClass.playMusic();
    }
}

/**
 * 适配器类
 *  继承需要适配的圆孔耳机类 实现我们当前业务的耳机接口
 */
class AdapterClass extends AdapteeClass implements HeadSet {

    @Override
    public void playMusic() {
        // 在重写耳机几口中 调用运控耳机的功能
        playMusicByOld();
    }
}

/**
 * typec耳机类 实现耳机接口
 */
class TypeCHeadSet implements HeadSet {

    @Override
    public void playMusic() {
        System.out.println("使用了type-C耳机收听音乐");
    }
}

/**
 * 需要被适配的类(圆孔耳机类)
 */
class AdapteeClass {

    public void playMusicByOld() {
        System.out.println("使用了圆孔耳机收听音乐");
    }
}


/**
 * 耳机接口
 */
interface HeadSet {
    /**
     * 耳机接口中定义收听音乐方法
     */
    void playMusic();
}

缺点

类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用,反之不可用。

2.对象适配器模式

 实现方式:对象适配器模式可以将适配对象引入适配器类中,该类同时实现当前系统的业务接口

修改类适配器:


/**
 * 类适配器测试类
 * 以手机type-c接口为例
 * type-c接口的手机都是没有单独的耳机插孔,而是与充电孔集成在一起
 * 我们以前买的圆孔的耳机就没法用了
 * 于是我们需要一种适配器 来适配圆孔的耳机
 *
 * @author Administrator
 */
public class Test {

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        TypeCHeadSet typec = new TypeCHeadSet();
        typec.playMusic();
        // 调用适配器类 在typec手机上使用圆孔耳机
        AdapterClass adapterClass = new AdapterClass(new AdapteeClass());
        adapterClass.playMusic();
    }
}

/**
 * 适配器类
 *  这里不再继承适配对象(圆孔耳机) 而是将圆孔耳机对象引入该类 同时还是实现当前业务的耳机接口
 */
class AdapterClass  implements HeadSet {

    // 适配者对象
    private AdapteeClass  adapteeClass;

    public AdapterClass(AdapteeClass  adapteeClass){
        this.adapteeClass = adapteeClass;
    }
    @Override
    public void playMusic() {
        // 在重写耳机几口中 调用运控耳机的功能
        adapteeClass.playMusicByOld();
    }
}

/**
 * typec耳机类 实现耳机接口
 */
class TypeCHeadSet implements HeadSet {

    @Override
    public void playMusic() {
        System.out.println("使用了type-C耳机收听音乐");
    }
}

/**
 * 需要被适配的类(圆孔耳机类)
 */
class AdapteeClass {

    public void playMusicByOld() {
        System.out.println("使用了圆孔耳机收听音乐");
    }
}


/**
 * 耳机接口
 */
interface HeadSet {
    /**
     * 耳机接口中定义收听音乐方法
     */
    void playMusic();
}

3.使用场景

  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。

  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值