• 适配器模式Adapter


    适配器模式类型:

    1. 类适配器模式:适配类的API转换成目标类的API
    2. 对象适配器模式:对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用关联关系连接到Adaptee类替代。
    3. 缺省适配器模式(接口适配器模式):

    角色:

       1.待适配类(Adaptee):需要适配的类或适配者类。

       2.目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

       3. 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。  

    生活例子: 笔记本电脑的插头一般都是三厢的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本电脑无法使用。这时候一个三厢到两厢的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。

    类适配器模式:

    1.待适配类(Adaptee):

    public class Adaptee {
        //取得插座 假设插座最基本的都是两厢的
        public void twoHoleSocket() {
            System.out.println("两厢插座");
        }
    }

    2.目标接口(Target):

    public interface Target {
        //两厢插座
        public void twoHoleSocket();
        //三厢插座
        public void threeHoleSocket();
    }

    3.适配器(Adapter):

    /**
     * 让Adapter拥有两厢插座,同时扩展了功能(三厢插座)
     */
    public class Adapter extends Adaptee implements Target {
        @Override
        public void threeHoleSocket() {
            System.out.println("三厢插座");
        }
    }

    测试与结果:

    public class Test {
        public static void main(String[] args) {
            Adapter adapter = new Adapter();
            adapter.twoHoleSocket();//两厢插座
            adapter.threeHoleSocket();//三厢插座 //这个功能就是适配器扩展的功能        
        }
    }

    对象适配器模式:

    1.待适配类(Adaptee):

    public class Adaptee {
        //取得插座 假设插座最基本的都是两厢的
        public void twoHoleSocket() {
            System.out.println("两厢插座");
        }
    }

    2.目标接口(Target):

    public interface Target {
        //两厢插座
        public void twoHoleSocket();
    
        //三厢插座
        public void threeHoleSocket();
    }

    3.适配器(Adapter):

    /**
     * 让Adapter拥有两厢插座,同时扩展了功能(三厢插座)
     */
    public class Adapter implements Target {
    
        private Adaptee adaptee = null;
    
        public Adapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
    
        /**
         * 待适配方法
         */
        @Override
        public void twoHoleSocket() {
            this.adaptee.twoHoleSocket();
        }
    
        /**
         * 适配器扩展方法
         */
        @Override
        public void threeHoleSocket() {
            System.out.println("三厢插座");
        }
    }

    测试与结果:

    public class Test {
        public static void main(String[] args) {
            Adaptee adaptee = new Adaptee();
            Adapter adapter = new Adapter(adaptee);
            adapter.twoHoleSocket();//两厢插座
            adapter.threeHoleSocket();//三厢插座 //这个功能就是适配器扩展的功能
        }
    }

    缺省适配器模式:

    定义一个 年轻的 类:4个方法

    public interface Young {
        public void eat();//吃饭
        public void sleep();//睡觉
        public void dou();//打痘痘
        public void talk();//聊天
    }

    定义一个本人的类:实现了 年轻的 类,问题是我没长痘啊,为毛要打痘痘? 没实现dou()方法编译都过不去

    public class Liang implements Young {
        @Override
        public void eat(){}
        @Override
        public void sleep(){}
        @Override
        public void talk(){}
    }

    我还是个 年轻的 人

    public abstract class People implements Young {
        @Override
        public void eat(){}
        @Override
        public void sleep(){}
        @Override
        public void dou(){}
        @Override
        public void talk(){}
    }

    不用打痘痘了吧,由于继承,也拥有people.dou()方法

    public class Liang extends People {
        @Override
        public void eat() {
            System.out.println("吃饭");
        }
        @Override
        public void sleep() {
            System.out.println("睡觉");
        }
        @Override
        public void talk() {
            System.out.println("没实现打痘痘的方法dou()");
        }
    }

    在很多情况下,必须让一个具体类实现某一个接口,但是这个类又用不到接口所规定的所有的方法。通常的处理方法是,这个具体类要实现所有的方法,那些有用的方法要有实现,那些没有用的方法也要有空的、平庸的实现。

      这些空的方法是一种浪费,有时也是一种混乱。除非看过这些空方法的代码,程序员可能会以为这些方法不是空的。即便他知道其中有一些方法是空的,也不一定知道哪些方法是空的,哪些方法不是空的,除非看过这些方法的源代码或是文档。

      缺省适配模式可以很好的处理这一情况。可以设计一个抽象的适配器类实现接口,此抽象类要给接口所要求的每一种方法都提供一个空的方法。

  • 相关阅读:
    java-垃圾回收机制
    Java 父类Object类的常用方法总结
    Java面试题-异常
    java面试题-多线程
    java面试题-java集合类
    java面试基础题整理学习
    解决Tomcat部署,运行start.bat闪退 警告 [main] org.apache.catalina.startup.Catalina.load Catalina.start using conf/server.xml: 元素类型 "Host" 必须由匹配的结束标记 "</Host>" 终止。
    JDK学习---深入理解java中的HashMap、HashSet底层实现
    java多线程批量读取文件( 八)--读写分离
    zookeeper集群(二)
  • 原文地址:https://www.cnblogs.com/manusas/p/6728115.html
Copyright © 2020-2023  润新知