• 适配器模式:揭秘措不及防需求变化的补救措施


    目录

    概述与模型

    1、概述

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

      说明:这是一种补救措施,在最开始设计的时候不建议使用这种设计模式。

      分类:类适配器、对象适配器。类适配器就是采用继承的方式,对象适配器采用组合的方式,源于Java里面只支持单继承,所以此处只实现对象适配器。

    2、模型

      

    应用场景描述

      场景描述:假设我需要在我的笔记本电脑上接入键盘,我这个键盘比较奇葩,不是USB接口的,是圆孔的。而且,我们这里还没有USB的卖,而且现在10000个程序员需要键盘,这种突发状况也很少见啊,很可能成为常态,我们又不可能去改变原来的设计结构,我们该怎么办?用户需求(使用键盘,我才不管怎么解决呢?)-->调用Adapter(转换器)-->Adaptee(圆孔线键盘)。而正常情况下是,用户需求(使用键盘)-->Adaptee(USB接口键盘)。我们来看实现。

    适配器模式实现

    1、目标对象

    public interface Target {
        public void request();
    }

    2、适配器

    public class Adapter implements Target {
        private Adaptee adaptee;
    
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Adapter(Adaptee adaptee) {
        </span><span style="color: #0000ff;">this</span>.adaptee =<span style="color: #000000;"> adaptee;
    }
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> request() {
        System.out.println(</span>"添加一个适配器给adaptee"<span style="color: #000000;">);
        adaptee.specialRequest();
    }
    

    }

    3、被适配者

    public class Adaptee {
        public void specialRequest(){
            System.out.println("接入键盘!");
        }
    }

    4、客户端测试

    public class Client {
        public static void main(String [] args){
            //流程:程序员-->使用(request)-->适配器(Adapter)-->键盘(Adaptee)
            Target coder=new Adapter(new Adaptee());
            //我要使用键盘
            coder.request();
        }
    }

    5、测试结果

    再进一步

    1、适配器模式是什么?适配器模式有什么用?

      将一个类的接口,转换成客户需要的接口。也就是说,用户只关心接口(Target),并不关心你内部的实现,而当有特殊需求的时候,我们只需要不断的新增适配器就行,并不用关心其他的。

      这是一种补救措施,最初设计不够完善的解决方案。

    2、真实世界的适配器

      IO中:InputStream-->FileInputstream-->File:最初IO肯定就是只是处理流,而不处理其他的。而随着变化,现在需求是,我要读取二进制流(二进制文件)。那么InputStream无法改变,用户需求无法改变,我们只能添加适配器来解决,从而就演变出FileInputStream、DataInputStream来充当适配器角色,可能以后还会出现各种处理流对象的适配器待你去解决呢。关于IO的整体处理细节参考我的装饰者模式:http://www.cnblogs.com/qiuyong/p/6538856.html

      InputStream-Target  is=new FileInputStream-Adapter (new File()-Adaptee);

      is.read(); 

      通过上述描述你可能已经知道适配器模式的作用了,不妨自己也造一个关于适配器模式的运用场景?

      比如,迭代器(Target)-->枚举类适配器-->处理hasNext()、...

    public class EnumrationIterator implements Iterator{
    
    Enumeration enumeration;
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> EnumrationIterator(Enumeration enumeration) {
        </span><span style="color: #0000ff;">this</span>.enumeration=<span style="color: #000000;">enumeration;
    }
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span><span style="color: #000000;"> hasNext() {
        </span><span style="color: #0000ff;">return</span> (<span style="color: #0000ff;">boolean</span><span style="color: #000000;">)enumeration.hasMoreElements();
    }
    
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Object next() {
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> enumeration.nextElement();
    }
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> remove() {
        </span><span style="color: #0000ff;">throw</span>  <span style="color: #0000ff;">new</span><span style="color: #000000;"> UnsupportedOperationException();
    }
    

    }

  • 相关阅读:
    C++ 字符串与数字之间的转换
    两种常见的模式匹配算法(代码实现)
    C++ string整行读取带空格的字符串
    JavaEE(一)开发环境搭建(JDK+Eclipse+Tomcat+Mysql+Spring)
    25java模拟容器的实现
    24java的StringBuilder类和StringBuffer类
    23java的String类常用方法
    22java的回调&内部类
    21java的抽象类和接口
    20java的组合&IDEA踩坑合集1
  • 原文地址:https://www.cnblogs.com/qiuyong/p/6541156.html
Copyright © 2020-2023  润新知