Java设计模式之适配器模式

适配器模式(有时候也称包装样式或者包装)定义:
将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ——Gang of Four

类适配器代码

/**
 * 原功能BASE
 * @author suk1M
 * 2017.07.24
 */
public class CBaseSing {

    public void baseSing(){
        System.out.println("I AM BASESING ");
    }

}
/**
 * 目标功能
 * @author suk1M
 * 2017.07.24
 */
public interface TargetSing {

    void Sing1();

    void Sing2();

    void Sing3();
}
/**
 * 静态适配器
 * @author suk1M
 * 2017.07.24
 */
public class SAdapterClass extends CBaseSing implements TargetSing {

    public void baseSing(){
        super.baseSing();
    }

    @Override
    public void Sing1() {
        System.out.println("I AM SING 1111111");
    }

    @Override
    public void Sing2() {
        System.out.println("I AM SING 2222222");
    }

    @Override
    public void Sing3() {
        System.out.println("I AM SING 3333333");
    }

}
public class TestDemo {

    /**
     * 静态适配测试方法
     * @param args
     */
    public static void main(String[] args) {

        SAdapterClass sAdapter = new SAdapterClass();

        sAdapter.baseSing();
        sAdapter.Sing1();
        sAdapter.Sing2();
        sAdapter.Sing3();

    }


}

结果如下:
这里写图片描述

对象适配器

/**
 * 原功能
 * @author suk1M
 * 2017.07.25
 */
public interface IBaseSing {

    void Sing1();

}

/**
 * 原功能实现类
 * @author suk1M
 * 2017.07.25
 */
public class IBaseSingImpl implements IBaseSing {

    @Override
    public void Sing1() {

        System.out.println("I AM BASESING 111111 ");
    }

}
/**
 * 目标功能
 * @author suk1M
 * 2017.07.24
 */
public interface TargetSing {

    void Sing1();

    void Sing2();

    void Sing3();
}
/**
 * 动态适配器
 * @author suk1M
 * 2017.07.24
 */
public class AdapterClass implements TargetSing {

    private IBaseSing bsing;

    public AdapterClass(IBaseSing bsing){
        this.bsing = bsing;
    }

    @Override
    public void Sing1() {
        bsing.Sing1();

    }

    @Override
    public void Sing2() {
        System.out.println("I AM SING 222222");

    }

    @Override
    public void Sing3() {
        System.out.println("I AM SING 333333");

    }

}
    /**
     * 动态适配测试方法
     * @param args
     */
    public static void main(String[] args) {

        IBaseSing iBsing = new IBaseSingImpl();
        AdapterClass adapter = new AdapterClass(iBsing);

        adapter.Sing1();
        adapter.Sing2();
        adapter.Sing3();

    }

测试结果如下:
这里写图片描述

基本概念
客户:需要调用我们的代码的对象。
Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。

主要内容
(1)类适配器:
当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。

(2)对象适配器:
对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。

使用的前提:
1.接口中规定了所有要实现的方法
2.但一个要实现此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。
实现方法
1.用一个抽象类实现已有的接口,并实现接口中所规定的所有方法,这些方法的实现可以都是“平庸”实现—-空方法;但此类中的方法是具体的方法,而不是抽象方法,否则的话,在具体的子类中仍要实现所有的方法,这就失去了适配器本来的作用。
2.原本要实现接口的子类,只实现1中的抽象类即可,并在其内部实现时,只对其感兴趣的方法进行实现。
注意事项
1.充当适配器角色的类就是:实现已有接口的抽象类
2.为什么要用抽象类:
此类是不要被实例化的。而只充当适配器的角色,也就为其子类提供了一个共同的接口,但其子类又可以将精力只集中在其感兴趣的地方。

======================================================

未完待续,23333。。

博主小白一枚,如果有不合理的地方还请指正。
(文章相关定义来源于百度百科)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值