设计模式(7)-桥接模式

来源:互联网 发布:spss数据分析实例 编辑:程序博客网 时间:2024/05/22 12:21

简介

为什么要使用桥接模式

举个例子来说明为什么要是用桥接模式。如果我们想绘制出长方形,圆形,三角形三个形状,我们可以创建四个形状类。但如果同时要求这些形状可能有红,绿,蓝等等颜色,那我们该怎么办呢?
现有如下两种方案:

  • 为每种形状都提供三种颜色。
  • 根据实际需要对形状和颜色进行组合。

哪种方法好呢?
当然是方案2好。方案2的实现方式即使桥接模式的应用。

什么是桥接模式

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

别名

  • 柄体(Handle and Body)模式
  • 接口(Interface)模式

类型

对象结构型模式。

遵循的原则

开闭原则。

角色

角色

  • Abstraction:抽象类
    • 抽象类
    • 声明了一个Implementor对象
  • RefinedAbstraction:扩充抽象类
    • 继承了Abstraction的具体类
    • 实现了Abstraction中的的抽象方法
    • 可以调用Implementor中的方法
  • Implementor:实现类接口
    • 实现类接口
    • 为抽象类提供方法
  • ConcreteImplementor:具体实现类
    • 具体实现类。
    • 为抽象类提供具体的业务方法

UML类图

MarkdownPhotos/master/CSDNBlogs/DesignPatterns/bridge.png

实现

  • 创建抽象类Abstraction
  • 创建扩充抽象类RefinedAbstraction.java
  • 创建实现类接口Implementor.java
  • 创建具体实现类ConcreteImplementorA.java、ConcreteImplementorB.java
  • 创建测试类Client.java

Abstraction.java

public abstract class Abstraction {    Implementor implementor;    public abstract void operation();}

RefinedAbstraction.java

public class RefinedAbstraction extends Abstraction {    public void operation() {        implementor.operationImpl();    }}

Implementor.java

public interface Implementor {    void operationImpl();}

ConcreteImplementorA.java

public class ConcreteImplementorA implements Implementor {    @Override    public void operationImpl() {        System.out.println("ConcreteImplementorA operationImpl");    }}

ConcreteImplementorB.java

public class ConcreteImplementorB implements Implementor{    @Override    public void operationImpl() {        System.out.println("ConcreteImplementorB operationImpl");    }}

Client.java

public class Client {    public static void main(String[] args) {        Abstraction abstraction = new RefinedAbstraction();        abstraction.implementor = new ConcreteImplementorA();        abstraction.operation();        abstraction.implementor = new ConcreteImplementorB();        abstraction.operation();    }}

测试
运行Client.java的main()

ConcreteImplementorA operationImplConcreteImplementorB operationImpl

实例:多形状多颜色绘图问题

  • 创建抽象类Shape
  • 创建扩充抽象类Circle.java、Circular.java、Tirangle.java
  • 创建实现类接口IColor.java
  • 创建具体实现类Red.java、Green.java、Blue.java
  • 创建测试类Client.java

抽象类Shape.java

public abstract class Shape {    IColor iColor;    public void draw(Shape shape) {        iColor.fillColor(shape);    }}

扩充抽象类Circle.java、Circular.java、Tirangle.java

public class Circle extends Shape {}public class Circular extends Shape {}public class Tirangle extends Shape {}

实现类接口IColor.java

public interface IColor {    void fillColor(Shape shape);}

具体实现类Red.java、Green.java、Blue.java

public class Red implements IColor {    @Override    public void fillColor(Shape shape) {        System.out.println("draw red " + shape.getClass().getSimpleName());    }}public class Green implements IColor {    @Override    public void fillColor(Shape shape) {        System.out.println("draw green " + shape.getClass().getSimpleName());    }}public class Blue implements IColor {    @Override    public void fillColor(Shape shape) {        System.out.println("draw blue " + shape.getClass().getSimpleName());    }}

测试类Client.java

public class Client {    public static void main(String[] args) {        Shape shape = new Circle();        shape.iColor = new Red();        shape.draw(shape);        shape = new Circular();        shape.iColor = new Green();        shape.draw(shape);    }}

测试
运行Client.java的main()

draw red Circledraw green Circular

优缺点

优点

  • 低耦合。桥接模式将抽象化(Abstraction)与实现化(Implementation)脱耦。即在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化。
  • 遵守“开闭原则”。在抽象部分和实现部分两个变化维度中任意扩展一个维度,都不需要修改原有代码。

缺点

  • 增加了系统设计的难度。

适用环境

  • 一个软件系统存在两个独立变化的维度,且这两个维度都需要进行扩展。

使用场景

待补充

问题

在软件开发中,你在哪里使用了桥接模式?如何使用的?

原创粉丝点击