Bridge 桥接模式 MD
桥接模式
简介
将抽象部分与实现部分分离,使它们都可以独立的变化。
业务抽象角色引用业务实现角色,或者说业务抽象角色的部分实现是由业务实现角色完成的
Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任
。它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性
以及应对它们的功能扩展。
可以这么理解,抽象是一个事物的本身的特征,行为是一个事物可以做的动作,特征是相对独享的,行为是可以共享的。
作用:解耦。
适用性
- 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为在程序运行时刻,实现部分应可以选择或者切换。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
- 想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
Window 与 WindowManager 之间的桥接模式
Window 类和 PhoneWindow 类为抽象部分,PhoneWindow 为 Window 类的唯一实现子类,在 Window 类中,持有了一个 WindowManager 类的引用,并且在 setWindowManager 方法中将其赋值为了 WindowManagerImpl 对象,对应着的 WindowManager 接口和 WindowManagerImpl 类就组成了实现部分,所以说这四个类使用的就是典型的桥接模式。Window 中的 addView,removeView 等操作都桥接给了 WindowManagerImpl 去处理。
案例1
抽象部分
业务抽象角色
public abstract class Person {
public Clothing clothing;
public String type;
public abstract void dress();
}
class Man extends Person {
public Man() {
this.type = "男人";
}
@Override
public void dress() {
clothing.personDressCloth(this);
}
}
class Lady extends Person {
public Lady() {
this.type = "女人";
}
@Override
public void dress() {
clothing.personDressCloth(this);
}
}
实现部分
业务实现角色(穿衣服)是一个事物(人)可以做的动作,在程序运行时刻,实现部分可以选择或者切换
public abstract class Clothing {
public abstract void personDressCloth(Person person);//人穿衣服
}
class Trouser extends Clothing {
@Override
public void personDressCloth(Person person) {
System.out.println(person.type + "穿裤子");
}
}
class Jacket extends Clothing {
@Override
public void personDressCloth(Person person) {
System.out.println(person.type + "穿马甲");
}
}
public class Test {
public static void main(String[] args) {
Person man = new Man();
Person lady = new Lady();
Clothing jacket = new Jacket();
Clothing trouser = new Trouser();
jacket.personDressCloth(man);
trouser.personDressCloth(man);
jacket.personDressCloth(lady);
trouser.personDressCloth(lady);
}
}
案例2
例如一辆赛车搭配的是硬胎就能够在干燥的马路上行驶,而如果要在下雨的路面行驶,就需要搭配雨胎了。这种根据行驶的路面不同,需要搭配不同的轮胎的变化的情况,我们从软件设计的角度来分析,就是一个系统由于自身的逻辑,会有两个或多个维度的变化,而为了应对这种变化,我们就可以使用桥接模式来进行系统的解耦。
桥接模式,作用是将一个系统的抽象部分和实现部分分离
,使它们都可以独立地进行变化
,对应到上面就是赛车的种类可以相对变化
,轮胎的种类可以相对变化
,形成一种交叉的关系,最后的结果就是一种赛车对应一种轮胎就能够成功产生一种结果和行为。
public abstract class Car {
private ITire tire;
public Car(ITire tire) {
this.tire = tire;
}
public ITire getTire() {
return tire;
}
public abstract void run();
}
public class RacingCar extends Car{
public RacingCar(ITire tire) {
super(tire);
}
@Override
public void run() {
Log.e("shawn", "racing car " + getTire().run());
}
}
public class SedanCar extends Car{
public SedanCar(ITire tire) {
super(tire);
}
@Override
public void run() {
Log.e("shawn", "sedan car " + getTire().run());
}
}
实现部分
public interface ITire {
String run();
}
public class RainyTire implements ITire{
@Override
public String run() {
return "run on the rainy road.";
}
}
public class SandyTire implements ITire{
@Override
public String run() {
return "run on the sandy road.";
}
}
测试代码:
Car car = new SedanCar(new RainyTire()); //有四种组合
car.run();
2016-03-30
Bridge 桥接模式 MD的更多相关文章
- C++设计模式-Bridge桥接模式
作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...
- Bridge桥接模式(结构型模式)
现有一个需求,一个游戏系统需要构建不同风格的房屋,暂不考虑其他设计模式,需要能实现在PC端.移动端....等等多个平台的构建.最简单的实现方式如下: /// <summary> /// 房 ...
- 设计模式07: Bridge 桥接模式(结构型模式)
Bridge 桥接模式(结构型模式) 抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象. 抽象B稳定,实现细节b变化 问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办? ...
- Bridge桥接模式(设计模式11)
在没有使用桥接模式: 扩展新问题(类归属膨胀问题) 1增加性的电脑类型,要增加每个品牌下面的类 2如果要增加一个新的电脑品牌,要增加美中电脑类型的类 违背单一职责原则: · 一个类:联想笔记本,有两个 ...
- 一天一个设计模式——Bridge桥接模式
一.概念准备 在理解桥接模式之前,先要理解面向对象程序设计中的两个概念: 类的功能层次结构:假设现在有一个类Something,这个类有一些成员属性和成员方法,但是现有的功能不能满足要求,因此我们想扩 ...
- Bridge桥接模式
当我们的功能要在多个维度进行扩展时,各个维度之间可以交叉组合,就可以考虑使用桥接模式. 将抽象部分与实现部分分离,使它们都可以独立的变化. ...
- 设计模式(八):Bridge桥接模式 -- 结构型模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...
- 面向对象设计模式纵横谈:Bridge 桥接模式(笔记记录)
桥接模式是一个比较难理解的设计模式,设计和分析的时候也不容易把握,咱们听听“李建忠”老师是怎么来讲的.我们还是从演变的角度来说问题,一步一步的来把问题说清楚.先谈谈“抽象”和“实现”的关系. 抽象与实 ...
- Bridge - 桥接模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...
随机推荐
- java实现两台电脑间TCP协议文件传输
记录下之前所做的客户端向服务端发送文件的小项目,总结下学习到的一些方法与思路. 注:本文参考自<黑马程序员>视频. 首先明确需求,在同一局域网下的机器人A想给喜欢了很久的机器人B发送情书, ...
- Bzoj4548 小奇的糖果(链表+树状数组)
题面 Bzoj 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左 ...
- 回顾2014 Java发生的5件大事
回顾2014 Java发生的5件大事 1.2月1日:RedMonk分析师确认并宣布Java是最受欢迎和多样化的语言! 2014年,Java生态圈伴随着引擎的轰鸣起步,随着FOSDEM年会的Free J ...
- 1005 Spell It Right (20)(20 point(s))
problem Given a non-negative integer N, your task is to compute the sum of all the digits of N, and ...
- 在Kali Linux上编译Windows EXP
使用vc6.0去编译的时候,难免会出现点问题 这里找到MS11-046的exp来编译 poc地址:https://www.exploit-db.com/exploits/40564/ 首先需要安装mi ...
- 【对比分析六】JavaScript中GET和POST的区别及使用场景
区别: GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符 POST:一般用于修改服务器上的资源,对所发送的信息没有限制 GET方式需要使用 Request ...
- hdu 1199 Color the Ball 离散线段树
C - Color the Ball Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- Linux下禅道系统的搭建
说明: 禅道系统的搭建,分两大部分 1.xampp环境的搭建 2.禅道系统的搭建 *********************************************************** ...
- Matlab 常用绘图指令(二维图形)
使用matlab的时候常常会忘掉一些指令,每次都要重新查找,挺麻烦的,这里收集一些常用的绘图指令,供自己和大家以后方便查找和使用. 1.例子-包含了常用绘图命令 clear clc %%数据准备 x ...
- PostgreSQL控制台以竖行显示
\x select * from user; 这个和MySQL的有点区别,在查询之前使用\x进行显示的开启 注意:只需要用一次即可,以后的查询都是以竖行进行显示.