适配器模式的定义和Java示例
定义
适配器模式(Adapter Pattern)是一种结构型设计模式,它主要解决了在软件系统中,经常会出现已有的类不能满足新的系统需求,需要进行修改源代码以适应新的需求。这时候就可以使用适配器模式,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式的主要目标是复用已存在的类,把这些类的接口转换成客户端期望的另一个接口,帮助我们将“原本不兼容的接口”变得兼容,从而重用现有的功能。
Java示例
假设我们有一个MediaPlayer
接口和一个实现了MediaPlayer
接口的AudioPlayer
类。但是,我们还有更高级的媒体播放器,例如 VlcPlayer
和 Mp4Player
。为了让 AudioPlayer
能够播放vlc和mp4格式的音频,我们可以创建一个适配器类 MediaAdapter
来连接 AudioPlayer
和 高级的媒体播放器。
// 媒体播放器接口
public interface MediaPlayer {
public void play(String audioType, String fileName);
}
// 音频播放器
public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
// 播放 mp3 音乐文件的内置支持
if(audioType.equalsIgnoreCase("mp3")){
System.out.println("Playing mp3 file. Name: " + fileName);
}
// mediaAdapter 提供了播放其他文件格式的支持
else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
}
else{
System.out.println("Invalid media. " + audioType + " format not supported");
}
}
}
在这个例子中,MediaAdapter
就是一个适配器,它能够让AudioPlayer
和高级媒体播放器之间进行通信。
装饰器模式的定义和Java示例
定义
装饰器模式(Decorator Pattern)也是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它在一个已有类上增加新的行为。
装饰器模式使用对象组合而非继承来实现新功能的扩展。通过创建一个包装对象以包含原始对象,可以提供额外的功能运行时被添加到对象中。
Java 示例
下面是一个简单的Java代码示例,演示了如何使用装饰器模式:
// 创建接口 Shape
public interface Shape {
void draw();
}
// 创建实现接口的实体类 Rectangle 和 Circle
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
// 创建抽象装饰类 ShapeDecorator 实现 Shape 接口
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
// 创建扩展了 ShapeDecorator 类的实体装饰类 RedShapeDecorator
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
// 使用 RedShapeDecorator 来装饰 Shape 对象
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
Shape redRectangle = new RedShapeDecorator(new Rectangle());
Shape redCircle = new RedShapeDecorator(new Circle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
在这个例子中,RedShapeDecorator
就是一个装饰器,它能够给已有的形状添加新的功能(红色边框)。
适配器模式和装饰器模式的区别
虽然适配器模式和装饰器模式在某些方面看起来相似,但它们解决的问题和实现方式有着本质的不同。
目标
首先,这两种模式的目标是不同的。适配器模式主要用于使接口不兼容的类可以一起工作,其核心思想是转换接口或数据。而装饰器模式则是为了给对象动态添加新的功能,其核心思想是扩展功能。
实现方式
其次,这两种模式的实现方式也有所不同。适配器模式通常通过创建一个新的适配器类来实现,该类包含一个对原始类的引用,并实现新的接口。而装饰器模式则是通过创建一个新的装饰器类来实现,该类继承自原始类,并覆盖其中的方法以添加新的功能。
使用场景
最后,这两种模式的使用场景也有所不同。适配器模式通常用于处理旧代码与新系统的集成问题,当我们无法修改旧代码,但又需要让它与新系统协同工作时,就可以使用适配器模式。而装饰器模式则更多地用于设计阶段,当我们希望在不修改原始类的情况下为其添加新的功能时,就可以使用装饰器模式。
总结起来,适配器模式和装饰器模式虽然都属于结构型设计模式,但它们解决的问题、实现方式以及使用场景都有所不同。理解这些差异对于正确地选择和应用这两种模式是非常重要的。