`
dragonhunter
  • 浏览: 33056 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

适配器模式 一个简单场景

    博客分类:
  • java
阅读更多

最近在重构旧的代码,感觉代码异常的糟糕,连配置文件都是在java代码中写死的。

这个不是本文的重点,本文主要通过一个例子来慢慢分析适配器的模式,对适配器模式可以先看下

http://haolloyin.blog.51cto.com/1177454/346128这个文章,写的不错,但是感觉还是有点抽象。

我们这里以java编程思想(第4版)的15章的泛型中提到的适配来讲解。(部分代码做了修改,并加了点自己的理解)

首先有一个Fill的类。

public class Fill {
    //初始化size个classToken放到collection里
    public static <T> void fill(Collection<T> collection,
           Class<? extends T> classToken, int size) {
        for(int i = 0; i < size; i++){
            collection.add(classToken.newInstance());
        }
    }
}

 再有一个比较简单的队列。

public class SimpleQueue<T> implements Iterable<T> {
    private LinkedList<T> storage = new LinkedList<T>();//LinkedList 也是一个simple队列
    public void add(T t) {storage.offer(t);}
    public T get() {return storage.poll();}
    public Iterator<T> iterator(){
        return storage.iterator();
    }
}

写个测试用例:

public class FillTest{
    public static void main(String[] args){
        List<String> list1 = new ArrayList<>();
        Fill.fill(list1,String.class,2);
        SimpleQueue<String> queue1 = new SimpleQueue<>();
        //下面的代码将会编译失败
        Fill.fill(queue1,String.class,2);
    }
}

 问题出来了,Fill类竟然不能处理SimpleQueue,我这里面也有add方法啊。是哪出问题了,对了,就是这个Fill类有问题,由于Fill设计的不合理,导致无法处理除Collection以外的类了。

 

那我们重新定义Fill类,这里命名为Fill2

//定义一个可add的接口
interface Addable<T> {void add(T t);}


public class Fill2{
    public static <T> void fill(Addable<T> addable,Class<? extends T> classToken, int size){
        for(int i= 0;i < size ; i++){
            try{
                addadle.add(clasToken.newInstance());
            }catch(Exception e){
                 throw new RuntimeException(e);
            }
        }
    }
}

这里我们定义了Fill2,它可以支持所有实现Addable接口的类,但是Collection没有实现Addable接口啊,那怎么办?就需要一个适配类了。

class AddableCollectionAdapter<T> implements Addable<T>{
    private Collection<T> c;
    //一个参数为Collection的构造器
    public AddableCollectionAdapter(Collection<T> c){
        this.c = c;
    }
    public void add(T item){
         c.add(item);
    }
}

这里由于Collection类是java内置的接口,我们不易使用类适配器(两个接口都有add()方法,Colleciont还有大量别的方法),最好使用对象适配器。 同理我们也可以为Simplequeue添加一个适配类,但Simplequeue是自己定义,使用类适配器会更好点:

class AddableSipleQueue<T> extends SimpleQueue<T> Addable<T> {
    public void add(T item ){super.add(item);}
}

 下面我们测试下:

class Fill2Test {
    public static void main(String[] args){
        List<String> list = new ArrayList<>;
        Fill2.fill(new AddableColletionAdapter(list),String.class,2);
        Addable<String> queue = new AddableSimpleQueue<>();
        Fill2.fill(queue,String.class,2);
    }
}

 写到这里再抛出个问题,如果还是用Fill类,那能不能写SimpleQueue适配类来适应Fill里的Collection?

总结下:适配有2种方式:类适配器和对象适配器。

              适配器一般用在前期设计不合理导致的,需要后期的修改,一般少用。

分享到:
评论

相关推荐

    适配器模式

    在某些情况下,适配器模式可能会被滥用,例如当一个简单的直接的方法可以解决问题时,开发者可能会不必要地引入一个复杂的适配器类。 根据提供的文件内容,其中包含了对适配器模式的简单描述和一些代码片段。这些...

    实验7 适配器模式、外观模式与模板方法模式

    适配器模式的主要作用是通过创建一个新的适配器类来包装现有类的接口,使其满足客户端的接口需求。 ##### 实现案例:文件加密模块 在这个案例中,我们需要创建一个`Cipher`类,它可以利用现有的`CipherMachine`类...

    深入浅出设计模式之适配器模式与外观模式

    适配器模式主要解决的是不同接口之间的适配问题,而外观模式则是在复杂的子系统中提供一个简洁的接口。两者虽然作用不同,但都遵循着设计模式的基本原则,即在保持代码简洁的同时,增强系统的可扩展性和可维护性。

    java常用设计模式-适配器模式

    下面是一个简单的适配器模式示例代码: ```java // 源接口 public class Adaptee { public void specificRequest() { System.out.println("Adaptee's specific request"); } } // 目标接口 public interface ...

    java设计模式;适配器模式(类)

    以下是一个简单的类适配器模式示例: ```java // 目标接口 public interface Target { void request(); } // 适配者类 public class Adaptee { public void specificRequest() { System.out.println("Adaptee's...

    设计模式之适配器模式(Adapter Pattern)

    在实际应用中,适配器模式常用于以下场景: 1. 集成第三方库或组件,它们的接口与项目需求不符。 2. 将遗留系统的接口转换为新的系统接口。 3. 处理不同硬件、操作系统或网络协议之间的兼容性问题。 通过使用适配器...

    PHP设计模式(五)适配器模式Adapter实例详解【结构型】

    - 当你需要使用一个已经存在的类,但是它的接口不符合你的需求时,可以通过适配器模式来调整接口。 - 创建可复用的类,使其能够与其他不相关的类或未来可能出现的类协同工作。 - 在对象适配器模式下,适配器可以适应...

    详解JavaScript实现设计模式中的适配器模式的方法_.docx

    在JavaScript中,适配器模式的实现可以非常简单,例如,当一个方法的名称或参数不匹配时,可以通过创建一个包装函数来解决。例如,如果客户端期望调用`add`方法,但实际上只有`sum`方法可用,可以创建一个名为`add`...

    适配器模式(Adepter)C#实现及案例

    以下是一个简单的C#适配器模式的示例: ```csharp // 目标接口 public interface ICompatibleInterface { void NewMethod(); } // 适配者类 public class OriginalClass { public void OldMethod() { // 原始...

    51丨适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?1

    适配器模式在实际开发中有很多应用场景,比如日志框架slf4j就是一个很好的例子。slf4j允许开发者使用不同的日志实现(如log4j、logback等),通过适配器将这些不兼容的日志接口转换成slf4j统一的API,使代码可以独立...

    设计模式:创建型之原型(深浅拷贝)、单例(饿汉式与懒汉式),三大工厂模式 结构型之适配器模式,代理模式(三大代理)

    结构型模式之适配器模式将一个类的接口转换成另一个接口,使得原本不兼容的接口可以协同工作。它通常分为类适配器和对象适配器,类适配器通过继承来完成接口转换,对象适配器则通过组合来完成。 设计模式是软件工程...

    Java经典设计模式之适配器模式原理与用法详解

    适配器模式的主要思想是,把一个类的接口适配成用户所期待的,使得原本由于接口不兼接而不能一起工作的一些类可以在一起工作。 适配器模式的原理: 适配器模式的原理可以分为两部分:对象适配器模式和类适配器模式...

    详解适配器与外观模式

    Adapter模式(适配器模式)的核心意图是将一个类的接口转换成客户端期望的另一个接口。它允许不兼容的接口之间进行交互。这种模式通常用于一个已经存在的类,其接口不符合客户端的要求,但又不希望修改已有的类,...

    Python设计模式之适配器模式原理与用法详解

    简单来说,适配器模式的作用是将一个类的接口转换成另一个接口,这样就可以在不修改现有代码的基础上,让原本因为接口不兼容而无法协作的类一起工作。 #### 二、适配器模式的核心概念 适配器模式涉及到以下几个...

    C++设计模式课件16_Adapter_适配器.pdf

    3. **想创建一个可以复用的类,该类可以与其他不同的类合作**:通过使用适配器模式,可以将不同类的接口转换成统一的形式,从而实现多个类之间的协作。 #### 三、适配器模式的结构 适配器模式通常包括以下几个组成...

    【IT十八掌徐培成】Java基础第06天-05.匿名内部类-适配器模式.zip

    在软件开发中,我们经常会遇到需要将一个类的接口转换为另一个接口的情况,这时适配器模式就能派上用场。适配器模式通过将不兼容的接口包装在一个兼容的外壳中,使得原本无法协同工作的类可以一起工作。 适配器模式...

Global site tag (gtag.js) - Google Analytics