设计模式(JAVA)——Adapter模式

1. Adapter模式

也有称为Wrapper模式。将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起
Adapter模式可以在完全不改变现有代码的前提下使现有代码适配于新的接口(API)。Adapter模式可用于版本升级和兼容性等方面。

2 UML类图

Adapter模式有以下两种:

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

2.1 类适配器模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qxkiNL02-1573282408945)(./resources/image/02/02-1_adapter1.png)]

2.1 对象适配器模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q4k6679d-1573282408947)(./resources/image/02/02-2_adapter2.png)]

2.3 登场角色

  • Target(对象)
    负责定义所需的方法。目标类

  • Client(请求者)
    使用Target角色所定义的方法进行具体操作,使用Target中的方法。

  • Adaptee(被适配)
    Adaptee拥有既定的方法,需要适配到Target角色方法。

  • Adpater(适配)
    使用Adaptee角色的方法来满足Target的需求

3. 示例程序

类和接口一览表

名字说明
Print表示目标类的接口或类
Client表示使用目标对象方法的类
Banner需要被适配的类
PrintBanner适配类

3.1 使用继承的示例程序

uml类图(只显示继承和实现关系)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wBsygmm-1573282408950)(./resources/image/02/02-3_adapter1.png)]

uml类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-shyGNy6b-1573282408952)(./resources/image/02/02-4_adapter1.png)]

代码实现

Print接口


package xin.ajay.adapter1;

//目标类接口
public interface Print {
    void printWeak();
    void printStrong();
}

Banner类


package xin.ajay;

//广告横幅(adaptee)
public class Banner {
    private String msg;

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

    //Banner个性的方法1
    public void showWithParen(){
        System.out.println("("+ msg +")");
    }

    //Banner个性的方法2
    public void showWithAster(){
        System.out.println("*" + msg + "*");
    }

}

PrintBanner类

package xin.ajay.adapter1;

import xin.ajay.Banner;


    public PrintBanner(String msg) {
        super(msg);
    }

    //适配到目标类
    @Override
    public void printWeak() {
        showWithParen();
    }

    //适配到目标类
    @Override
    public void printStrong() {
        showWithAster();
    }
}

Client类

package xin.ajay.adapter1;

import xin.ajay.adapter1.Print;
import xin.ajay.adapter1.PrintBanner;
//使用者
public class Client {
    public static void main(String[] args) {
        //使用Print,被适配的对象在这儿是被
        Print p = new PrintBanner("Hello");
        p.printWeak();
        p.printStrong();
    }
}

3.2 使用委托的示例程序

uml类图(只显示继承和实现关系)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uiX9NSls-1573282408954)(./resources/image/02/02-5_adapter2.png)]

uml类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WganFXFP-1573282408957)(./resources/image/02/02-6_adapter2.png)]

Print类

package xin.ajay.adapter2;
public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

Banner类

与上面一样

PrintBanner类

package xin.ajay.adapter2;

import xin.ajay.Banner;

public class PrintBanner extends Print{
    private Banner banner;

    public PrintBanner(Banner banner) {
        this.banner = banner;
    }

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

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

Client类

package xin.ajay.adapter2;

import xin.ajay.Banner;

public class Client {
    public static void main(String[] args) {
        Print p = new PrintBanner(new Banner("Hi"));

        p.printWeak();
        p.printStrong();
    }
}
鸣谢:

GoF《设计模式》和结城浩的《图解设计模式》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值