Java设计模式设计模式

《设计模式》桥接模式

2019-08-25  本文已影响0人  敏捷Studio

基本介绍

定义

将抽象部分与实现部分分离,使它们都可以独立的变化。

介绍

UML类图

桥接模式UML类图

角色说明:

具体实现

这里以穿衣服为例,不同职业的人可能要穿的衣服不一样。

1、创建实现化角色。定义一个衣服接口:

interface Clothes {
  String getName();
}

2、创建具体实现化角色。创建两种衣服类:校服和衬衫。

public class Uniform implements Clothes {
  @Override
  public String getName() {
    return "校服";
  }
}

public class Shirt implements Clothes {
  @Override
  public String getName() {
    return "衬衫";
  }
}

3、创建抽象化角色。定义一个人物类,有一个穿衣服的方法,并且持有衣服类的引用。即抽象化角色持有实现化角色的引用,可以调用实现化角色的方法,达到桥接的作用。

public abstract class Person {
  // 持有衣服类的引用
  Clothes mClothes;

  public void setClothes(Clothes clothes) {
    mClothes = clothes;
  }
  
  // 穿衣服
  protected abstract void dress();
}

4、创建具体抽象化角色。这里有两种角色穿衣服:学生和程序员。

public class Student extends Person {
  @Override
  protected void dress() {
    System.out.println("学生穿上" + mClothes.getName());
  }
}

public class Coder extends Person {
  @Override
  protected void dress() {
    System.out.println("程序员穿上" + mClothes.getName());
  }
}

5、客户端测试:

public void test() {
  // 创建各种衣服对象
  Clothes uniform = new Uniform();
  Clothes shirt = new Shirt();

  // 不同职业的人穿衣服
  Person coder = new Coder();
  coder.setClothes(shirt);
  coder.dress();

  System.out.println("--------------------------------------");
  Person student = new Student();
  student.setClothes(uniform);
  student.dress();

  System.out.println("--------------------------------------");
  student.setClothes(shirt);
  student.dress();
}

输出结果:

程序员穿上衬衫
--------------------------------------
学生穿上校服
--------------------------------------
学生穿上衬衫

6、其他说明:
通过上面的例子可以看到,我们分离了两端的变化。新增衣服和新增职业都变的非常简单。假如我们再增一个维度的变化,例如加个年龄来区分怎么办?这时我们就可以把Person类作为实现化角色,把不同年龄段作为抽象化角色,代码就不写了,有兴趣可以去实现一下。

模式总结

应用场景

优点

缺点

Android中的源码分析

桥接模式在Android中的源码应用还是非常广泛的。比如AbsListViewListAdapter之间就是一个桥接模式。

1、AbsListViewListAdapter 之间的桥接模式
相关代码就不贴了,看下它们的UML类图就明白了。

AbsListView 与 ListAdapter 之间的桥接模式

这里AbsListView是抽象化角色,ListAdapter则是实现化角色。

2、其他
另外,WindowWindowManager 之间也是桥接模式。有兴趣的可以去看下源码体会体会。

上一篇 下一篇

猜你喜欢

热点阅读