zoukankan      html  css  js  c++  java
  • 适配器设计模式--《Head first 设计模式》阅读笔记

    什么适配器设计模式呢?

    现在有接口A,客户类的请求这个接口。但是我们希望客户调用的是接口A和接口B,但是这个过程对客户类是透明的。需要造一个适配器,使由于接口不兼容而不能交互的类可以一起工作。

    下面是实现的例子:

    //鸭子接口
    public interface Duck {
        public void quack();
        public void fly();
    }
    //鸭子实现类
    public class MallardDuck implements Duck {
        public void quack() {
            System.out.println("Quack");
        }
     
        public void fly() {
            System.out.println("I'm flying");
        }
    }
    //火鸡接口
    public interface Turkey {
        public void gobble();
        public void fly();
    }
    //火鸡实现类
    public class WildTurkey implements Turkey {
        public void gobble() {
            System.out.println("Gobble gobble");
        }
     
        public void fly() {
            System.out.println("I'm flying a short distance");
        }
    }

    主函数:

    public class DuckTestDrive {
        public static void main(String[] args) {
            //分别创造鸭子和火鸡对象
            MallardDuck duck = new MallardDuck();
            WildTurkey turkey = new WildTurkey();
            //让鸭子作出动作
            System.out.println("
    The Duck says...");
            testDuck(duck);
            //让火鸡作出动作
            System.out.println("The Turkey says...");
            turkey.gobble();
            turkey.fly();
            /**这时候我想统一地用testDuck这个静态方法控制鸭子和火鸡
             * 于是我创造一个适配器来把火鸡嫁接到鸭子接口上去,但是这个过程对用户是透明的
             * 用户还是只调用鸭子的静态方法,实际打印的是火鸡的动作
             */
            Duck turkeyAdapter = new TurkeyAdapter(turkey);
            System.out.println("
    The TurkeyAdapter says...");
            testDuck(turkeyAdapter);
        }
     
        static void testDuck(Duck duck) {
            duck.quack();
            duck.fly();
        }
    }

    补上适配器类:

    public class TurkeyAdapter implements Duck {
        Turkey turkey;
     
        public TurkeyAdapter(Turkey turkey) {
            this.turkey = turkey;
        }
        
        public void quack() {
            turkey.gobble();
        }
      
        public void fly() {
            for(int i=0; i < 5; i++) {
                turkey.fly();
            }
        }
    }

    总结:

    客户认为他正在和鸭子沟通,目标是鸭子类,是客户在其上调用方法的类。通过扩展两个几口(鸭子和火鸡),适配器使得火鸡可以响应对鸭子的请求。或积累没有鸭子的方法,但是适配器可以将对鸭子方法调用,转接调用火鸡方法。

  • 相关阅读:
    HTMLDOM
    换行
    【iOS】APP之数据存储
    开启远程XUL
    iOS之Streams
    Plugin的生命周期
    ActiveX Control Test Container
    ObjectiveC Runtime III【objc_msgSend函数】
    What is a Digital Signature?
    JS变量作用域
  • 原文地址:https://www.cnblogs.com/cracker13/p/9471792.html
Copyright © 2011-2022 走看看