zoukankan      html  css  js  c++  java
  • 设计模式——适配器模式

    适配器模式

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

    Example: 指鹿为马

    假设由鹿和马的类:

    package com.gitlearning.hanldegit.patterns.adapter;
    
    // 鹿
    public class Deer {
        void walk() ;
    }
    
    
    package com.gitlearning.hanldegit.patterns.adapter;
    
    // 马
    public interface Horse {
        void run() ;
    }
    
    

    以及各自实现黑马和白鹿(话说《白鹿原》这本书还可以的,陈忠实先生的叙述引人入胜):

    package com.gitlearning.hanldegit.patterns.adapter;
    
    public class BlackHorse implements Horse {
        @Override
        public void run() {
            System.err.println("黑马在跑");
        }
    }
    
    
    package com.gitlearning.hanldegit.patterns.adapter;
    
    public class WhiteDeer implements Deer {
        @Override
        public void walk() {
            System.err.println("silence walk.");
        }
    }
    
    

    看下鹿的适配器,

    package com.gitlearning.hanldegit.patterns.adapter;
    
    public class DeerAdapter implements Horse {
        Deer deer;
    
        public DeerAdapter(Deer deer) {
            this.deer = deer;
        }
    
        @Override
        public void run() {
            deer.walk();
        }
    }
    
    

    通过测试程序,来见证奇迹:

     @Test
        void test() {
            Deer deer = new WhiteDeer();
            Horse blackHorse = new BlackHorse();
            DeerAdapter deerAdapter = new DeerAdapter(deer);
            System.err.println(deer instanceof Deer);
            System.err.println(blackHorse instanceof Horse);
            System.err.println("白鹿是马吗?" + (deer instanceof Horse));
            System.err.println("适配器是马吗?" + (deerAdapter instanceof Horse));
            
        }
    

    我们发现输出为:

    true
    true
    白鹿是马吗?false
    适配器是马吗?true
    

    哈哈,如果当时赵高使用了DeerAdapter,当然可以说它就是马啦!

    使用

    并发包Executors有个静态内部类RunnableAdapter(对象适配器),成功的将Runnable转换成了Callable。在ThreadPoolExecutor调用submit(Runnable)的时候,内部默默的调用过RunnableAdapter将Runnable转为Callable。

    这里还有一个FutureTask类实现了RunnableFuture接口,该接口分别继承了Runnable和Future接口,也是适配器的一种实现,不过是另一种实现,类适配器。

    static final class RunnableAdapter<T> implements Callable<T> {
            final Runnable task;
            final T result;
            RunnableAdapter(Runnable task, T result) {
                this.task = task;
                this.result = result;
            }
            public T call() {
                task.run();
                return result;
            }
        }
    

    其他

    1. 适配器将一个对象包装起来以改变其接口;装饰者模式将一个对象包装起来以增加新的行为和责任;外观将一群对象包装起来以简化其接口。
    2. 当需要一个现有的类而其接口并不符合你的需要时,就使用适配器
    3. 适配器的实现复杂度依据目标接口的大小与复杂度而定。
    4. 适配器两种形式:类适配器和对象适配器
    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    VS2017专业版和企业版激活密钥
    jquery 中的回调函数,回调函数(callback)是什么?
    artDialog
    MVC 5 视图之公用代码
    联想服务器thinkserver rd650安装 windows server 2008 r2
    c#类库中使用Session
    C#导出Excel按照指定格式设置单元格属性值
    visual studio 2017使用NHibernate4.0连接oracle11g数据库
    NHibernate连接oracle报错
    第五章 面向方面编程___通知类型
  • 原文地址:https://www.cnblogs.com/studentytj/p/11295841.html
Copyright © 2011-2022 走看看