java设计模式——adapter模式

描述

将现有的模块接口转换一下,以适配新的接口需求,用于填补“现有的程序“和“所需的程序“之间差异。通常也会被称为:wrapper(包装)模式。

模式中的角色

adapter模式中有以下主要角色:
1. target(对象)
该角色负责定义所需的方法,描述需要adapter转换之后的接口。
2. client(请求者)
转换之后的接口使用者,client通过adapter访问已有的旧接口。
3. adaptee(被适配者)
已经存在的旧接口实现者,提供老旧的接口实现,是需要adapter转换的对象。
4. adapter(适配者)
是本模式的核心,用于将现有的接口转换成需要的接口。

模式分类

在实际操作中,通常adapter模式有以下两种形式:

  1. 类适配器模式(使用继承的适配器)
  2. 对象适配器模式(使用委托的适配器)

为了方便描述,这里我们举一个实际的例子,这里的例子就是广告条幅展示的例子。现有的广告条幅展示形式有带有括号的展示方式:
(这里是广告的内容)
还有带有星号的形式:
*这里是广告的内容*
这是目前已有的两种形式。现在有一个新的电子广告展示器,可以展示加粗和不加粗的字体广告,加粗的形式就是使用星号将广告的内容包含起来,就像上面的形式;不加粗的就是使用括号将广告内容包含起来,也是和上面的一样。
现在的做法就是做一个适配器,使用这个适配器adapter将老的广告展示转换成新的广告展示形式
这个例子中涉及的模式角色有:

  • target——新的广告展示形式
  • client——广告投递商
  • adaptee——旧的广告展示牌
  • adapter——适配器,需要实现的

涉及到的java类有:

  • IPrint——这是一个接口,对应target
  • Main——这是主类,对应client
  • Banner——这是旧的广告展示实现,对应adaptee
  • PrintBanner——这是广告展示转换器,对应adapter

类适配器模式

类适配器模式使用类继承和接口实现的方式实现,类图描述如下:
这里写图片描述
代码如下:

IPrint

/*************************************************************************
    > File Name: IPrint.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Fri Mar  2 11:29:26 2018
 ************************************************************************/
public interface IPrint {
    void printWeak();
    void printStrong();
}
/*************************************************************************
    > File Name: Banner.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Fri Mar  2 11:30:10 2018
 ************************************************************************/
public class Banner {
    private String name;

    public Banner(String name) {
        this.name = name;
    }

    public void showWithParen() {
        System.out.println("(" + name + ")");
    }

    public void showWithAster() {
        System.out.println("*" + name + "*");
    }
}

PrintBanner

/*************************************************************************
    > File Name: PrintBanner.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Fri Mar  2 11:32:59 2018
 ************************************************************************/
public class PrintBanner extends Banner implements IPrint {
    public PrintBanner(String name) {
        super(name);
    }

    @Override
    public void printWeak() {
        super.showWithParen();
    }

    @Override
    public void printStrong() {
        super.showWithAster();
    }
}

Main

/*************************************************************************
    > File Name: Main.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Fri Mar  2 11:35:06 2018
 ************************************************************************/
public class Main {
    public static void main(String argv[]) {
        // 这里我们使用IPrint类型,就是为了面向接口,而不是面向具体实现类。
        // 因为Main作为一个client对象,只需要直接接口定义就行了,不需要知道实现
        IPrint printer = new PrintBanner("This is banner.");
        printer.printWeak();
        printer.printStrong();
    }
}

对象适配器模式

和类适配器模式不同的是,对象适配器模式使用的组合模式实现,也就是委托。将自己需要完成的一些工作,委托给别的对象完成。上面的类适配器模式中,我们将PrintBanner类继承自Banner来获得Banner的能力,其实我们还可以通过委托来实现。具体的做法就是在PrintBanner中加入一个内部字段,类型就是Banner。通过内部持有的Banner对象来访问Banner的方法。所做的修改就是将类适配模式中的PrintBanner修改为如下:

/*************************************************************************
    > File Name: PrintBanner.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Fri Mar  2 11:37:43 2018
 ************************************************************************/
public class PrintBanner implements IPrint {
    private Banner banner;

    public PrintBanner(String name) {
        banner = new Banner(name);
    }

    @Override
    public void printWeak() {
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}

类图描述如下:
这里写图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值