https://www.ituring.com.cn/book/1811
代码
https://www.aliyundrive.com/s/7M6kdZ9Kytq

适应性设计模式

1 Iterator模式——一个一个遍历

1.2 示例程序

示例程序的作用是将书放置到书架中,并将书的名字按照顺序显示出来。
image.png
image.png

2 Adapter模式——加个适配器以便于复用

2.1 Adapter模式

Adapter模式也被称为Wrapper模式。Wrapper有“包装器”的意思。
Adapter模式有以下两种适配器

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

    2.2 使用继承的适配器

    示例:将交流100伏特电压转换成直流12伏特电压的适配器。
    电源的比喻和示例程序对应关系
电源的比喻 示例程序
实际情况 交流100伏特 Banner类(showWithParen、showWithAster)
变换装置 适配器 PrintBanner类
需求 直流12伏特 Print接口(printWeak、printStrong)

使用了“类适配器模式”的示例程序的类图(使用继承)

image.png

  1. public class Banner {
  2. private String string;
  3. public Banner(String string) {
  4. this.string = string;
  5. }
  6. public void showWithParen() {
  7. System.out.println("(" + string + ")");
  8. }
  9. public void showWithAster() {
  10. System.out.println("*" + string + "*");
  11. }
  12. }

Print接口
是“需求”接口

  1. public interface Print {
  2. void printWeak();
  3. void printStrong();
  4. }

PrintBanner类
该类扮演适配器决角色。继承了Banner。同时又实现了Print接口。

  1. public class PrintBanner extends Banner implements Print {
  2. public PrintBanner(String string) {
  3. super(string);
  4. }
  5. @Override
  6. public void printWeak() {
  7. showWithParen();
  8. }
  9. @Override
  10. public void printStrong() {
  11. showWithAster();
  12. }
  13. }

2.3 使用委托的示例程序

使用了“对象适配器模式”的示例程序的类图(使用委托)

image.png

PrintBanner类

  1. public class PrintBanner extends Print {
  2. private Banner banner;
  3. public PrintBanner(String string) {
  4. this.banner = new Banner(string);
  5. }
  6. @Override
  7. public void printWeak() {
  8. banner.showWithParen();
  9. }
  10. @Override
  11. public void printStrong() {
  12. banner.showWithAster();
  13. }
  14. }

Print类

  1. public abstract class Print {
  2. public abstract void printWeak();
  3. public abstract void printStrong();
  4. }

2.4 Adapter模式中的角色

在Adapter模式中有以下角色。

  • Target(对象) 该角色是定义所需的方法。
  • Client(请求者) 该角色负责使用Target角色定义的方法进行具体处理
  • Adaptee(被适配)Adaptee是一个持有特定方法的角色
  • Adapter(适配)

image.png