`
指尖残血
  • 浏览: 2998 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

本文参考:《修炼Java开发技术:在架构中体验设计模式和算法之美   于广编著》。

 

适配器模式是指将一个接口转换成客户希望的另一个接口,该模式使得原本不兼容的类可以一起工作。

 适配器模式分为如下两类:

1、类的适配器模式。

2、对象的适配器,采用对象组合方式实现。

下面使用例子说明两类:

例如:现在在工作中有一个能说汉语和英语的岗位,而一个面试者只会说汉语,我们的任务就是将这个人适配到这个岗位中。

1、类的适配器模式:

package org.dyb.design.adapter;

public interface Job {
	public void speakChinese();
	public void speakEnglish();
}

 

package org.dyb.design.adapter;

public class Person {

	public void speakChinese(){
		System.out.println("speak chinese");
	}
}

 

package org.dyb.design.adapter;

public class Adapter extends Person implements Job {

	@Override
	public void speakEnglish() {
		System.out.println("speak English");
	}
}

 测试:

package org.dyb.design.adapter;

import org.junit.Test;

public class TestAdapter {
	@Test
	public void test(){
		Job j = new Adapter();
		j.speakChinese();
		j.speakEnglish();
	}
}

结果:

speak chinese
speak English
2、对象的适配器模式

只需要修改adapter适配器实现方法。

package org.dyb.design.adapter;

public class Adapter implements Job {
	private Person person = null;
	public Adapter(Person person){
		this.person = person;
	}
	@Override
	public void speakEnglish() {
		System.out.println("speak English");
	}

	@Override
	public void speakChinese() {
		person.speakChinese();
	}
}

 测试:

package org.dyb.design.adapter;

import org.junit.Test;

public class TestAdapter {
	@Test
	public void test(){
		Person p = new Person();
		Job j = new Adapter(p);
		j.speakChinese();
		j.speakEnglish();
	}
}

 结果:

speak chinese
speak English

 

Java流接口和装饰模式的关系

    Java程序中,inputstream抽象类中有很多子类,FileInputStream、ObjectInputStream、StringBufferInputStream、ByteArrayInputStream、PipedInputStream等是可以被装饰器装饰的对象。

   FilterInputStream相当于装饰模式中的Decorator,而它的子类DataInputStream、BufferedInputStream、LineNumberInputStream、PushbackInputStream就相当于装饰模式中的ConcreteDecorator。

  举例:

对英文进行加密,a->c    y->a     z->b

package decorator.demo;

import java.io.IOException;
import java.io.OutputStream;

public class EncryptOutputStream extends OutputStream {

    private OutputStream os = null;

    public EncryptOutputStream(OutputStream os) {
        this.os = os;
    }

    @Override
    public void write(int a) throws IOException {
        a += 2;
        if (a >= (97 + 26)) {
            a -= 26;
        }
        this.os.write(a);
    }

}

 

package decorator.demo;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

public class TestDecorator {

    @Test
    public void test() throws IOException {
        DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(new EncryptOutputStream(
                new FileOutputStream("mytest.txt"))));
        dout.write("abcdxyz".getBytes());
        dout.close();
    }
}

 打开mytest.txt

cdefzab

 

如果把EncryptOutputStream和bufferedOutputStream位置调换,这样就不行。因为EncryptOutputStream继承的不是装饰类

下面是最合理的解决方案:

让我们的装饰器集成装饰器的父类,就是FilterOutputStream类,然后使用父类提供的功能来协助完成想要装饰的功能。

package decorator.demo;

import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class EncryptOutputStream2 extends FilterOutputStream {

    public EncryptOutputStream2(OutputStream os) {
        super(os);
    }

    @Override
    public void write(int a) throws IOException {
        a += 2;
        if (a >= (97 + 26)) {
            a -= 26;
        }
        super.write(a);
    }

}

 运行test2

package decorator.demo;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

public class TestDecorator {

    @Test
    public void test() throws IOException {
        DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(new EncryptOutputStream(
                new FileOutputStream("mytest.txt"))));
        dout.write("abcdxyz".getBytes());
        dout.close();
    }
    
    @Test
    public void test2() throws IOException{
        DataOutputStream dout = new DataOutputStream(new EncryptOutputStream2 (new BufferedOutputStream(
                new FileOutputStream("mytest.txt"))));
        dout.write("abcdxyz".getBytes());
        dout.close();
    }
    
}

 结果:cdefzab

分享到:
评论

相关推荐

    JAVA设计模式(抽象类与适配器模式)

    今天我们要探讨的是JAVA设计中的两个重要模式:抽象类与适配器模式。 首先,我们来理解一下“抽象”。抽象是面向对象编程的核心概念之一,它帮助我们处理对象的复杂性。在Java中,抽象通常通过抽象类来实现。抽象类...

    设计模式之适配器模式Java实现和类设计图

    在这个Java实现中,我们将深入探讨适配器模式的两大类型:类适配器模式和对象适配器模式,并通过具体的代码示例和UML类图来阐述其工作原理。 首先,我们来理解适配器模式的基本概念。适配器模式就像现实生活中的...

    设计模式之适配器模式

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...

    设计模式 - 适配器模式(C++实例)

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...

    java 动态代理模式 适配器模式

    Java动态代理模式与适配器模式是两种在软件设计中常用的设计模式,它们都有各自的优点和应用场景。在Java中,动态代理模式主要依赖于Java的反射API和InvocationHandler接口,而适配器模式则用于解决不同接口之间的...

    java设计模式之适配器模式

    适配器模式是一种在软件工程中广泛使用的结构型设计模式,它允许两个不兼容的接口之间进行通信。在Java中,适配器模式扮演着重要的角色,尤其在处理遗留代码或者第三方库集成时,能够有效地解决接口不匹配的问题。...

    java中适配器模式案例

    适配器模式是一种设计模式,它允许不兼容的类或接口之间进行通信,通过创建一个适配器类作为中间桥梁,使得原本不匹配的接口能够协同工作。在Java中,适配器模式广泛应用于系统集成、旧代码复用以及第三方库的兼容性...

    适配器模式案例代码

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在这个案例中,我们关注的是如何通过适配器模式解决实际编程问题。文章《适配器模式案例代码》提供了具体的实现示例,链接指向了CSDN博主...

    设计模式-适配器模式(讲解及其实现代码)

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在处理系统集成、遗留代码重用以及不同接口之间兼容性问题时。适配器模式的主要目的是将两个不兼容的接口融合在一起,使得原本无法直接协作...

    适配器模式demo源码

    适配器模式是一种常用的设计模式,它在软件开发中起到了桥梁的作用,允许两个不兼容的接口之间进行通信。在这个“适配器模式demo源码”中,我们可以深入理解这一模式的实现方式及其应用场景。 适配器模式的核心思想...

    设计模式系列之适配器模式

    适配器模式是一种软件设计模式,它在不同的接口之间起到了桥梁的作用,使得原本由于接口不兼容而无法协作的类能够协同工作。这种模式的核心思想是将一个类的接口转换成客户希望的另一个接口,从而使原有类能适应新的...

    设计模式的适配器模式的例子

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,允许不同接口的类之间进行通信。适配器模式的核心思想是将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类...

    实验七:适配器模式.rar

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在本实验中,我们将深入探讨适配器模式的概念、应用场景以及如何在实际编程中实现它。适配器模式通常分为类适配器和对象适配器两种形式。 ...

    适配器模式源代码

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,允许不兼容的接口之间进行通信。在这个源代码实例中,我们看到的是如何通过适配器模式来实现不同对象之间的协作,使得原本无法直接交互的系统组件...

    设计模式C++学习之适配器模式(Adapter)

    适配器模式(Adapter)是软件工程中一种常用的设计模式,它允许两个不兼容的接口之间进行通信。在C++编程中,适配器模式能够帮助我们复用现有的类,或者将第三方库的接口与我们的系统接口进行对接,从而提高代码的可...

Global site tag (gtag.js) - Google Analytics