桥接模式 ゞ 浴缸里的玫瑰 2021-05-18 20:36 397阅读 0赞 ## 一、概述 ## **一般问题:**一个类需要在两个以上维度扩展,采用继承方式会导致子类数量过多 **核心方案:**将抽象部分与实现部分分离,使其都可以独立变化 **设计意图:**桥接模式不是将两个不相干的类链接,而是将一个需要多维度变化的类拆分成抽象部分和实现部分,并且在抽象层对两者做组合关联,是用组合的方式来解决继承的问题。举个例子,如果一个类在两个维度分别有m和n种变化,采用继承的方式就需要扩展出m\*n个子类,且一个维度每增加一种变化就多出另一个维度变化总数的子类;如果将两个维度拆分再组合,加起来也只有m+n个子类,且每个维度独立扩展,一个维度增加一种变化只需要增加1个子类。 ![format_png][] 如上图,Abstraction就是桥接模式中的“桥”,它含有一个实现部分实例,且提供动态设置具体实现类地方法,这样抽象部分和实现部分的子类可以随意组合。 下面举一个简单的例子:夏天都喜欢吃烧烤,就以烧烤为例,我们从两个维度分析:从食材上有鸡翅、鸡腿等;从风味上有微辣、特辣等。 我们把食材做为抽象部分,把风味作为实现部分: ![format_png 1][] 先看实现部分变化: 风味类Spicy public interface Spicy{ String taste(); } 微辣SlightSpicy public class SlightSpicy implements Spicy{ public String taste(){ return "微辣"; } } 特辣ExtraSpicy public class ExtraSpicy implements Spicy{ public String taste(){ return "特辣"; } } 再看抽象部分变化: 烧烤类Barbecue public abstract class Barbecue{ protected Spicy mSpicy; //实现部分实例 public Barbecue(Spicy spicy){ 桥接模式的关键,组合实现和抽象 this.mSpicy= spicy; } public abstract void eat(); } 鸡翅类ChickenWing public class ChickenWing extends Barbecue{ public ChickenWing (Spicy spicy){ super(spicy); } public void eat(){ System.out.println( "鸡翅:"+super.mSpicy.taste()); } } 测试: public class Test{ public static void main(String[] args){ Barbecue barbecue = new ChickenWing(new SlightSpicy()); barbecue .eat(); Barbecue barbecue2 = new ChickenWing(new ExtraSpicy()); barbecue2 .eat(); } } 输出: 鸡翅:微辣 鸡翅:特辣 -------------------- ## 二、实战应用 ## 我们知道Android中ListView的Adapter的设计用到了适配器模式,实际上Adapter本身还包含在一个桥接模式之中! ![format_png 2][] 上图是整个AdapterView类图,对比桥接模式的UML图,不难看出整体上它是个大的桥接模式,我们抽取其中的AbsListView这个小的桥接模式来分析: ![format_png 3][] AbsListView表示集合视图,其有两个维度变化: 1. 显示形式变化,如列表形式ListView或网格形式GridView; 2. 数据类型变化,如字符串数组SimpleAdapter或数据库游标CursorAdapter Android将显示形式作为抽象部分,数据类型作为实现部分,两个部分各自独立变化。 抽象部分和实现部分在AbsListView抽象层做了组合关联,体现代码如下: public abstract class AbsListView extends AdapterView<ListAdapter>{ ListAdapter mAdapter; @Override public void setAdapter(ListAdapter adapter) { if (adapter != null) { mAdapterHasStableIds = mAdapter.hasStableIds(); if (mChoiceMode != CHOICE_MODE_NONE && mAdapterHasStableIds && mCheckedIdStates == null) { mCheckedIdStates = new LongSparseArray<Integer>(); } } clearChoices(); } } -------------------- ## 三、总结 ## **总结:**桥接模式是一种结构型设计模式,根据最小继承原则,将各个变化部分分离,从而实现独立变化互不干涉,但又在更高的抽象层实现组合以保证各子类能动态结合。 用一句话来概括桥接模式: > “打断骨头还连着筋” **优点:** * 抽象和实现分离 * 易于扩展 **缺点:**桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 原文作者:[观雪听涛][Link 1] 出处:[http://www.cnblogs.com/not2/][Link 1] [format_png]: /images/20210518/1ff9ad7e753949f291aa0f4a11d4836b.png [format_png 1]: /images/20210518/b0bd826662b84cb5ad9d1284d221843c.png [format_png 2]: /images/20210518/8078237021544608b3bb885e4bd8dd6f.png [format_png 3]: /images/20210518/0d9b94c6b63343148a8397595f1d479d.png [Link 1]: http://www.cnblogs.com/not2/
相关 桥接模式 > 本文总结摘自刘伟老师的《设计模式》和程杰老师的《大话设计模式》 1.定义 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。(桥接模式用关联关系来降低 ╰半橙微兮°/ 2022年01月27日 09:37/ 0 赞/ 205 阅读
相关 桥接模式 桥接模式,有些类似排列组合,下面先引用一个非常经典的例子来理解桥接模式。假如某位画画爱好者去买画笔,他需要大、中、小三种型号且具有6种颜色的画笔,如果买彩笔,他需要买3×6=1 快来打我*/ 2021年11月05日 21:46/ 0 赞/ 341 阅读
相关 桥接模式 桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦 本是古典 何须时尚/ 2021年09月29日 16:06/ 0 赞/ 328 阅读
相关 桥接模式 A1 A2 与 B1 B2 组合 通常情况下 定义A接口或抽象类,A1 A2实现或继承A,然后A1B1和A1B2继承A1,A2B1和A2B2继承A2,各自输出。这样做关联关 超、凢脫俗/ 2021年09月28日 06:58/ 0 赞/ 304 阅读
相关 桥接模式 1.桥 public interface Bridge { void tagetLand(); } 桥的实现 publ 怼烎@/ 2021年09月21日 00:50/ 0 赞/ 333 阅读
相关 桥接模式 桥接模式:是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作 我会带着你远行/ 2021年09月17日 03:34/ 0 赞/ 329 阅读
相关 桥接模式 10.桥接模式 ![70][] class Client { static void Main(string[] arg ╰+攻爆jí腚メ/ 2021年09月16日 23:56/ 0 赞/ 305 阅读
相关 桥接模式 一 概述 现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系: ![在这里插入图片描述][watermark £神魔★判官ぃ/ 2021年07月24日 20:06/ 0 赞/ 458 阅读
相关 桥接模式 一、概述 一般问题:一个类需要在两个以上维度扩展,采用继承方式会导致子类数量过多 核心方案:将抽象部分与实现部分分离,使其都可以独立变化 设计意图:桥接模式不是将两个 ゞ 浴缸里的玫瑰/ 2021年05月18日 20:36/ 0 赞/ 398 阅读
相关 桥接模式 接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模... 小灰灰/ 2020年06月13日 05:52/ 0 赞/ 709 阅读
还没有评论,来说两句吧...