图解设计模式(九)Bridge 模式

本文深入探讨了桥接模式,一种使功能与实现分离的设计模式,允许两者独立扩展。通过一个装饰文本程序的例子,展示了如何使用桥接模式来解耦功能层次结构与实现层次结构。

读书笔记 仅供参考

Bridge 模式

将类的功能层次结构和类的实现层次结构相连接

类的层次结构

类的功能层次结构

  • 父类具有基本结构
  • 在子类中增加新的功能

类的实现层次结构

  • 父类通过声明抽象方法来定义接口(API)
  • 子类通过实现具体方法来实现接口(API)

UML 和角色

Abstraction

位于“功能层次结构”顶层,角色保存了 Implementor 的实例

RefinedAbstraction

继承 Abstraction,添加新功能。

Implementor

位于“实现层次结构”的顶层,定义了用于实现 Abstraction 角色接口(API)的方法。

ConcreteImplementor

负责实现 Implementor 定义的接口(API)。

 

例子

例程是一个装饰文本的程序,Display 类担任 ABstraction 角色,它的方法都通过 DisplayImpl(抽象类,担任 Implementor 角色) 类定义的方法来实现。CountDisplay 类继承 Display,并添加了一个新方法。StringDisplayImpl 继承 DisplayImpl,实现了定义的方法。Display 和 CountDisplay 属于功能层次结构,DisplayImpl 和 StringDIsplayImpl 属于实现层次结构。

 UML

public class Display {
    private DisplayImpl impl;
    public Display(DisplayImpl impl) {
        this.impl = impl;
    }

    public void open() {
        impl.rawOpen();
    }

    public void print() {
        impl.rawPrint();
    }

    public void close() {
        impl.rawClose();
    }

    public final void display() {
        open();
        print();
        close();
    }
}

 

public class CountDisplay extends Display {
    public CountDisplay(DisplayImpl impl) {
        super(impl);
    }

    public void multiDisplay(int times) {
        open();
        for(int i = 0; i<times; i++) {
            print();
        }
        close();
    }
}
public abstract class DisplayImpl {
    public abstract void rawOpen();
    public abstract void rawPrint();
    public abstract void rawClose();
}
public class StringDisplayImpl extends DisplayImpl {
    private String string;
    private int width;

    public StringDisplayImpl(String string) {
        this.string = string;
        this.width = string.getBytes().length;
    }

    @Override
    public void rawOpen() {
        printLine();
    }

    @Override
    public void rawPrint() {
        System.out.println("|" + string + "|");
    }

    @Override
    public void rawClose() {
        printLine();
    }

    private void printLine() {
        System.out.print("+");
        for(int i = 0; i < width; i++) {
            System.out.print("-");
        }
        System.out.println("+");
    }
}
public class Main {
    public static void main(String[] args) {
        Display d1 = new Display(new StringDisplayImpl("Hrllo, China."));
        Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World."));
        CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe"));

        d1.display();
        d2.display();
        d3.display();
        d3.multiDisplay(5);
    }
}

 

 

要点

Bridge 的特征就是将功能层次结构和实现层次结构分离开来,两者可以独立的扩展。impl 对象就是将两者连接起来的桥梁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值