设计模式之笔记--桥接模式(Bridge)
桥接模式(Bridge)
定义
桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。
类图
描述
Abstraction:定义抽象部分的接口,通常在这个接口里面要维护一个实现部分的对象引用;在抽象部分的方法里面需要调用实现部分的方法,这个抽象部分的方法里面通常都是跟具体的业务相关的方法;
RefinedAbstraction:扩展抽象部分的接口,通常在这些方法里面定义跟实际业务相关的方法,这些方法通常会使用Abstraction中定义的方法,也可能需要调用实现部分的方法来完成;
Implementor:定义实现部分的接口,这个接口不用和Abstraction里面的方法一致,通常是由Implementor接口提供基本的操作,而Abstraction里面定义的是基于这些基本操作的业务方法,也就是说Abstraction定义了基于这些基本操作的较高层次的操作;
ConcreteImplementor:实现Implementor接口。
应用场景
手机品牌有MEIZU、IPhone等品牌,每种手机都可以安装音乐、游戏等app,但是MEIZU手机的操作系统是Flyme OS基于Android,IPhone的操作系统是IOS,所以同一款音乐或游戏app都要有Android和IOS两种版本。
按手机品牌划分的类图如下:
按app功能划分的类图如下:
如果现在要增加一种WP操作系统的手机,那么就需要在MobilePhone下增加一个子类,同时给这个子类增加音乐和游戏的app子类;如果再增加一个导航功能的app,那么就需要在每种手机下增加一个导航app子类;如果再增加其他手机或其他功能的app,那么上述类图将会变得无比庞大。这时就需要对类图作一些改进。
从上述类图可以看到,手机上可以安装音乐、游戏等app,也可以不安装,不管安不安装这些app,都不会影响手机的使用,由此可见手机和app之间的关系是一种聚合关系。于是,可以把上面的类图改为如下:
这样就把手机和app分离开了,也就意味着如果要增加手机种类,只需在MobilePhone下增加一个子类;如果要增加app种类,只需在MobilePhoneApp下增加一个子类;不管是增加手机或是app的种类都不会影响其他类。
组合/聚合复用原则,尽量使用组合/聚合,而不要使用类继承。
public abstract class MobilePhoneApp
{
public abstract void Run();
} public class Music : MobilePhoneApp
{
public override void Run()
{
Console.WriteLine("运行手机音乐.");
}
} public class Game : MobilePhoneApp
{
public override void Run()
{
Console.WriteLine("运行手机游戏.");
}
} public abstract class MobilePhone
{
protected MobilePhoneApp app; public MobilePhone(MobilePhoneApp app)
{
this.app = app;
} public abstract void Run();
} public class MEIZU : MobilePhone
{
public MEIZU(MobilePhoneApp app)
: base(app)
{ } public override void Run()
{
this.app.Run();
}
} public class IPhone : MobilePhone
{
public IPhone(MobilePhoneApp app)
: base(app)
{ } public override void Run()
{
this.app.Run();
}
}
设计模式之笔记--桥接模式(Bridge)的更多相关文章
- 设计模式 笔记 桥接模式 Bridge
//---------------------------15/04/15---------------------------- //Bridge 桥接模式----对象结构型模式 /* 1:意图:将 ...
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
- 设计模式学习心得<桥接模式 Bridge>
说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...
- IOS设计模式浅析之桥接模式(Bridge)
引言 在项目开发中,我们会遇到这样的一种场景:某些类型由于自身的逻辑,往往具有两个或多个维度的变化,比如说大话设计模式书中所说的手机,它有两个变化的维度:一是手机的品牌,可能有三星.苹果等:二是手机上 ...
- Java-马士兵设计模式学习笔记-桥接模式
一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...
- 设计模式入门之桥接模式Bridge
Abstraction:抽象部分的父类,定义须要实现的接口.维护对实现部分的引用,从而把实现桥接到Implementor中去 Implementor:实现部分的接口 RefinedAbstractio ...
- 学习笔记——桥接模式Bridge
桥接模式的目的是在设计初,就将实现与接口分离,在以后实现发生变化时,只需要改变传递的实现对象,在保持接口一致的情况,达到实现的变更. 在OperationInterface中就调用实现的方法imp.O ...
- 《JAVA设计模式》之桥接模式(Bridge)
在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
随机推荐
- hdu 2722 Here We Go(relians) Again (最短路径)
Here We Go(relians) Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- POJ 3261 Milk Patterns (后缀数组,求可重叠的k次最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16742 Accepted: 7390 Ca ...
- BZOJ1591 & 洛谷2924:[USACO2008 DEC]Largest Fence 最大的围栏——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1591 https://www.luogu.org/problemnew/show/P2924#sub ...
- 项目管理---git----快速使用git笔记(五)------本地项目代码提交到远程仓库---新建项目
上一篇我们已经知道了怎么从远程仓库获取项目文件代码. 项目管理---git----快速使用git笔记(四)------远程项目代码的首次获取 git还有一种使用场景是 我本来在电脑里就有一个项目,现在 ...
- HDU 3507 斜率优化dp
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- js ejs for语句的第二种遍历用法
var A = {a:1,b:2,c:3,d:"hello world"}; for(var k in A) { console.log(k,A[k]); var h = new ...
- Struts整合ExtJS
1准备工作: 除了平时引入的struts2的jar包以外,还需要引入struts2-json-plugin-2.1.8.1.jar:json-lib-2.1.jar这两个包. 2.建立我们的model ...
- 温习js中对象的继承
温故而知新 XD 1. 关于原型和构造函数的几个知识要点: 使用new 操作符调用构造函数,会经历以下四个步骤: 1.1. 创建一个新对象: 1.2. 将构造函数的作用域赋给新对象(因此 this 就 ...
- 数据结构:Rope
以BZOJ1507为例,这里仅仅展示动态区间问题的一些典型操作,包括插入删除和修改,查询的话不支持按顺序查询 使用起来很简单很方便 #include<cstdio> #include< ...
- Python编写在Maya中查看文件列表的插件
之前写过一篇用Python遍历文件夹的文章,今天把代码扩展一下,做成一个有UI用户界面的Maya插件,可以直接在Maya中运行: 功能是显示磁盘分区目录下的文件列表,通过定制也可以查看任意目录下的文件 ...