android 桥接,Android的设计模式-桥接模式

本文详细介绍了桥接模式的概念、UML类图、实现方式以及在Android开发中的应用实例,如AbsListView与ListAdapter的桥接。通过这个模式,实现了抽象与实现的分离,增强了系统的扩展性和灵活性。示例中展示了如何使用桥接模式设计人物类与衣服类,使得不同职业的人物可以穿戴不同类型的衣服,展示了模式在多维度变化场景下的优势。
摘要由CSDN通过智能技术生成

前言

Android的设计模式系列文章介绍,欢迎关注,持续更新中:

1.定义

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

2.介绍

桥接模式属于结构型模式。

举个生活中的例子,一条数据线,一头USB接口的可以连接电脑、充电宝等等,另一头可以连接不同品牌的手机,通过这条数据线,两头不同的东西就可以连接起来,这就是桥接模式。

3.UML类图

acf598db6d4d

桥接模式UML类图.jpg

角色说明:

Abstraction(抽象化角色):一般是抽象类,定义该角色的行为,同时保存一个对实现化角色的引用。

Implementor(实现化角色):接口或者抽象类,定义角色必需的行为和属性。

ConcreteImplementorA、ConcreteImplementorB(具体实现化角色):实现角色的具体行为。

4.实现

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

4.1 创建实现化角色

定义一个衣服接口:

interface Clothes {

String getName();

}

4.2 创建具体实现化角色

创建两种衣服类:校服和衬衫。

public class Uniform implements Clothes {

@Override

public String getName() {

return "校服";

}

}

public class Shirt implements Clothes {

@Override

public String getName() {

return "衬衫";

}

}

4.3 创建抽象化角色

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

public abstract class Person {

Clothes mClothes;//持有衣服类的引用

public void setClothes(Clothes clothes) {

mClothes = clothes;

}

protected abstract void dress();//穿衣服

}

4.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());

}

}

4.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();

}

输出结果:

程序员穿上衬衫

--------------------------------------

学生穿上校服

--------------------------------------

学生穿上衬衫

4.6 其他说明:

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

5. 应用场景

一个类存在两个或以上的独立维度的变化,且这些维度都需要进行拓展。

不希望使用继承或因为多层次继承导致类的个数急剧增加时。

如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,可以通过桥接模式使他们在抽象层建立一个关联关系。

6. 优点

分离了抽象与实现。让抽象部分和实现部分独立开来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。

良好的扩展性。抽象部分和实现部分都可以分别独立扩展,不会相互影响。

7. 缺点

增加了系统的复杂性。

不容易设计,抽象与实现的分离要设计得好比较有难度。

8. Android中的源码分析

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

8.1 AbsListView 与 ListAdapter 之间的桥接模式

相关代码就不贴了,看下它们的UML类图就明白了。

acf598db6d4d

AbsListView 与 ListAdapter 之间的桥接模式.png

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

8.2 其他

另外,Window 与 WindowManager 之间也是桥接模式。有兴趣的可以去看下源码体会体会。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值