暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《Head First 设计模式》:适配器模式

惊却一目 2021-08-19
273

正文


一、定义


适配器模式将一个类的接口(被适配者),转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。


要点:


  • 适配器实现了目标接口,并持有被适配者的实例。

  • 适配器使用被适配者的方法,把请求转换成被适配者的一个或多个方法。

  • 客户通过目标接口调用适配器的方法对适配器发出请求。

  • 客户与被适配者是解耦的,一个不知道另一个。

  • 当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。


二、实现步骤


1、创建被适配者接口

    /**
    * 被适配者接口
    */
    public interface Adaptee {

    public void specificRequest();
    }

    2、创建具体的被适配者,并实现被适配者接口

      /**
      * 具体的被适配者
      */
      public class ConcreteAdaptee implements Adaptee {

      @Override
      public void specificRequest() {
      System.out.println("ConcreteAdaptee is doing something...");
      }
      }

      3、创建目标接口

        /**
        * 目标接口
        */
        public interface Target {

        public void request();
        }

        4、创建适配器类,并实现目标接口


        适配器持有被适配者,并在收到请求时调用被适配者的方法。

          /**
          * 适配器
          */
          public class Adapter implements Target {

          /**
          * 被适配者
          */
          Adaptee adaptee;

          public Adapter(Adaptee adaptee) {
          this.adaptee = adaptee;
          }


          @Override
          public void request() {
          // 调用被适配者方法
          adaptee.specificRequest();
          }
          }

          5、使用适配器转换被适配者

            public class Test {

            public static void main(String[] args) {
            // 被适配者
            Adaptee adaptee = new ConcreteAdaptee();
            // 适配器
            Adapter adapter = new Adapter(adaptee);
            adapter.request();
            }
            }


            三、举个栗子


            1、背景


            你上班的公司做了一套模拟鸭子游戏。现在,假设你缺鸭子对象,想用一些火鸡对象来冒充。


            显而易见,因为火鸡的接口不同,所以我们不能公然拿来用。


            2、实现


            使用适配器把火鸡的方法转换成鸭子的方法,这样表面上看起来就像是一只鸭子了。


            (1)创建火鸡接口

              /**
              * 火鸡接口(被适配者)
              */
              public interface Turkey {

              /**
              * 咯咯叫
              */
              public void gobble();

              /**
              * 飞行
              */
              public void fly();
              }

              (2)创建具体的火鸡

                /**
                * 野火鸡
                */
                public class WildTurkey implements Turkey {


                @Override
                public void gobble() {
                System.out.println("Gobble gobble");
                }


                @Override
                public void fly() {
                System.out.println("I'm flying a short distance");
                }
                }

                (3)创建鸭子接口

                  /**
                  * 鸭子接口(目标接口)
                  */
                  public interface Duck {

                  /**
                  * 呱呱叫
                  */
                  public void quark();

                  /**
                  * 飞行
                  */
                  public void fly();
                  }

                  (4)创建火鸡适配器,并实现鸭子接口

                    /**
                    * 火鸡适配器
                    */
                    public class TurkeyAdapter implements Duck {

                    /**
                    * 火鸡
                    */
                    Turkey turkey;

                    public TurkeyAdapter(Turkey turkey) {
                    this.turkey = turkey;
                        }


                    @Override
                    public void quark() {
                    turkey.gobble();
                        }


                    @Override
                    public void fly() {
                    // 火鸡飞行距离比鸭子短,因此需要调用5次火鸡的fly()方法。
                    for (int i = 0; i < 5; i++) {
                    turkey.fly();
                    }
                    }
                    }

                    (5)使用火鸡适配器,将火鸡适配成鸭子

                      public class Test {

                      public static void main(String[] args) {
                      // 火鸡(被适配者)
                      Turkey turkey = new WildTurkey();
                      // 火鸡适配器
                      TurkeyAdapter turkeyAdapter = new TurkeyAdapter(turkey);
                      turkeyAdapter.quark();
                      turkeyAdapter.fly();
                      }
                      }


                      文章转载自惊却一目,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论