设计模式10——Adapter设计模式

适配器模式解析
本文介绍了适配器设计模式的概念及应用场景,详细解释了通过组合和继承两种方式实现适配器模式的方法,并提供了具体的Java代码示例。此外,还列举了一些JDK中使用适配器模式的例子。

Adapter适配器模式是将两个不兼容的类组合在一起使用。生活中笔记本电脑和手机等数码产品的充电器就是一个适配器,将家用220V的交流电转换为笔记本或手机正常工作所需的目标电压和电流。适配器起到一种转换和包装的作用。

Adapter设计模式主要目的组合两个不相干类,常用有两种方法:第一种解决方案是修改各自类的接口。但是如果没有源码,或者不愿意为了一个应用而修改各自的接口,则需要使用Adapter适配器,在两种接口之间创建一个混合接口。

Adapter适配器设计模式中有3个重要角色:被适配者Adaptee,适配器Adapter和目标对象Target。其中两个现存的想要组合到一起的类分别是被适配者Adaptee和目标对象Target角色,我们需要创建一个适配器Adapter将其组合在一起。

实现Adapter适配器设计模式有两种方式:组合(compositon, has-a关系)和继承(inheritance,is-a关系)。

对象适配器模式使用组合,UML图如下:

类适配器模式使用继承,UML图如下:


假设要画图形,有圆形和方形两个类,现在需要一个既可以画圆形又可以画方形的类。

组合关系的Adapter适配器模式如下:

//圆形,目标对象
class Cirecle{
    public void drawCircle(){
	System.out.println(“Draw circle”);
    }
}


//方形,被适配对象
class Square{
    public void drawSquare(){
	System.out.println(“Draw square”);
    }
}


//既可以画圆形,又可以画方形,适配器
public class HybridShape extends Circle{
    private Square square;
    public HybridShape(Square square){
	this.square = square;
    }

    public void drawSquare(){
	square.drawSquare();
    }
}

适配器继承目标对象,同时组合被适配对象,如果需要画圆时,直接调用父类的画圆方法即可,如果需要画方,则调用被适配对象的画方形方法。

继承关系的Adapter适配器模式如下:

interface ICircle{
    public void drawCircle();
}


interface ISquare{
    public void drawSquare();
}


//圆形
class Cirecle implements ICircle{
    public void drawCircle(){
	System.out.println(“Draw circle”);
    }
}


//方形
class Square implements ISquare{
    public void drawSquare(){
	System.out.println(“Draw square”);
    }
}


//既可以画圆形,又可以画方形,适配器
public class HybridShape implements ICircle, ISquare{
    private ISquare square;
    private ICircle circle;

    public HybridShape(Square square){
	this.square = square;
    }

    public HybridShape(Circle circle){
	this.circle = circle;
    }

    public void drawSquare(){
	square.drawSquare();
    }

    public void drawCircle(){
	circle.drawCircle();
    }
}

Java中类不允许多继承,但是可以实现多个接口,继承关系的Adapter适配器设计模式就是利用java可以实现多个接口的特性。

JDK里面的适配器模式应用:

java.util.Arrays#asList()
java.io.InputStreamReader(InputStream)
java.io.OutputStreamWriter(OutputStream)
javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

转载于:https://my.oschina.net/hongdengyan/blog/183953

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值