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

1.Bridge模式

将类的功能层次结构和实现层次结构分离

类的层次结构的两个作用:

  1. 增加新的功能
    父类拥有基本功能,在子类中增加新的功能。
    Something
    ----|SomethingGood
    --------|SomethingBetter

  2. 增加新的实现
    父类声明抽象方法来定义接口(API),子类实现具体方法来实现接口
    AbstractClass
    ----|ConcreteClass
    ----|AnotherConcreteClass

1.1 Bridge模式的类图

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

登场角色:

  • Abstraction(抽象化)
    定义了基本功能,类功能层次结构的最顶层

  • RefinedAbstraction(改进后的抽象化)
    在Abstraction角色基础上增加了功能

  • Implementor(实现者)
    功能的真正的实现者,位于类实现层次结构的最顶层

  • ConcreteImplementor(具体的实现者)
    实现了在Implementor中定义的接口

1.2 示例程序

类一览表:

名字说明
Display功能层次结构
DisplayImpl实现层次结构
CountDisplay扩展了功能层次结构
StringDisplayImpl一种实现方式
Main测试类

uml类图

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

Display类

package xin.ajay.bridge;

public class Display{
    private DisplayImpl impl;

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

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

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

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

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

DisplayImpl类

package xin.ajay.bridge;

public abstract class DisplayImpl {
    public abstract void open();

    public abstract void print();

    public abstract void close();
}

CountDisplay类

package xin.ajay.bridge;

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

    public void multiDiplay(int times){
        open();
        for (int i = 0; i < times; i++) {
            print();
        }
        close();
    }
}

StringDisplayImpl类

package xin.ajay.bridge;

public class StringDisplayImpl extends DisplayImpl {

    private  String msg;
    private int width;

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

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

    private void printLine() {
        System.out.print("+");
        for (int i = 0; i < width; i++) {
            System.out.print("-");
        }
        System.out.println("+");
    }

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

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

Mian类

package xin.ajay.bridge;

public class Main {

    public static void main(String[] args) {
        Display d1 = new Display(new StringDisplayImpl("hello"));
        Display d2 = new CountDisplay(new StringDisplayImpl("hello"));
        CountDisplay d3 = new CountDisplay(new StringDisplayImpl("hello"));

        d1.display();
        d2.display();
        d3.multiDiplay(2);
    }
}

结果

+-----+
|hello|
+-----+
+-----+
|hello|
+-----+
+-----+
|hello|
|hello|
+-----+
鸣谢

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值