• 设计模式-适配器模式


    一、概念
    如果系统中存在不兼容的接口,可以通过引入一个适配器使原本不兼容的两个类可以一起工作,而无需修改现有事务的内部结构。
    举例说明,生活电压时220V,但是手机、电脑的电压没有这么高,为了使它们也能使用220V的生活电压,需要电源适配器(变压器),使得手机和电脑可以与生活用电兼容
    适配器模式中定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器,它所包装的对象就是是适配者,即被适配的类。
    适配器模式分类适配器和对象适配器


    二、角色
    1.目标抽象类(Target)
    用户要用的特定领域的接口,可以是抽象类和接口或具体类。在类适配器中,由于java不支持多重继承,只能是接口。

    2.适配者类(Adaptee)
    适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类型的源码
    3.适配器类(Adapter)
    可以调用另一个接口作为转换器,对Traget和Adaptee进行适配,是适配器模式的核心。
    在类适配器中,通过实现Target接口并继承Adaptee类来使二者产生关系;
    在对象适配器中,通过继承Target并关联一个Adaptee对象使二者产生联系。


    三、举例说明
    类适配器:现有一个机器人作为抽象类,具备的抽象方法有叫(cry)和移动(move)。另有一个狗类,有具体方法叫(wang)和跑(run)。现需要用机器人实现的业务方法是狗类中的方法。则创建一个适配器类来实现机器人接口,通过继承狗类从而调用狗这个父类的方法,在cry()里调用wang(),在move()里调用run()。

    public interface Robot {
        public void cry();
        public void move();
    }
    
    class Dog{
        public void wang() {
            System.out.println("狗汪汪叫");
        }
        public void run() {
            System.out.println("狗跑");
        }
    }
    
    class DogAdapter extends Dog implements Robot{//类适配器模式
        public void cry() {
            System.out.println("仿生机器人:");
            super.wang();
        }
        public void move() {
            System.out.println("仿生机器人:");
            super.run();
        }
    }

    对象适配器:在适配器类里定义一个适配者狗类对象(关联),需要使用适配者方法的时候通过对象dog直接调用。另外继承或实现抽象目标类(或接口)。

    package shipeiqi;
    
    public interface Robot {
        public void cry();
        public void move();
    }
    
    class Dog{
        public void wang() {
            System.out.println("狗汪汪叫");
        }
        public void run() {
            System.out.println("狗跑");
        }
    }
    
    class DogAdapter implements Robot{
        private Dog dog;//对象适配器模式
        public DogAdapter() {
            dog=new Dog();
        }
        public void cry() {
            System.out.println("仿生机器人:");
            dog.wang();
        }
        public void move() {
            System.out.println("仿生机器人:");
            dog.run();
        }
    }

    类适配器模式需要通过super调用,这里通过对象调用,不能多重继承,个人觉得用对象适配器比较好。

  • 相关阅读:
    重拾web开发JavaScript复习
    Linq GroupBy
    Gotchas 31对目标类型为指涉物为常量的指针类型的类型转换的认识误区
    感谢你遇到的问题
    IDisposable模式的一点理解
    感谢你遇到的问题(2)
    .Net通过OutLook发送邮件,附件的名称太长会显示乱码
    深度学习利器之自动微分(1)
    建议转载的发在文章(Aticles)而不是随笔(Posts)内
    Forum,ForumGroup和my forum的汉译
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11768580.html
Copyright © 2020-2023  润新知