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. 适配器两种形式:类适配器和对象适配器
    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    2017 Multi-University Training Contest
    ACM 竞赛高校联盟 练习赛 第一场
    hdu 6194 string string string(后缀数组)
    Codeforces Round #433 (Div. 1) D. Michael and Charging Stations(dp)
    Codeforces Round #433 (Div. 2) E. Boredom(主席树)
    Codeforces Round #433 (Div. 2) C. Planning(贪心)
    Codeforces Round #433(Div. 2) D. Jury Meeting(贪心)
    hdu 6191 Query on A Tree(dfs序+可持久化字典树)
    hdu 6183 Color it(线段树)
    poj 2464 Brownie Points II(扫描线)
  • 原文地址:https://www.cnblogs.com/studentytj/p/11295841.html
Copyright © 2011-2022 走看看