B桥接模式ridge
1.一个简短的引论
1)模式概述:将抽象部分与实现部分分离。使它们都能够独立的变化。让抽象类和派生类各自实现自己的对象。当一个系统有多维度的变化时,将各个维度分离出来让它们独立于变化(多角度地分类实现对象),从而降低耦合。
它非常好的符合了OCP和优先使用对象,从而避免了仅仅用继承所造成的大量类的添加
2)核心:将抽象化(Abstraction)与实现化(Implementation)解耦。用组合/聚合关系取代继承
抽象化:将存在共性的多个实体当做一个实体对待。忽略多余信息
实现化:抽象化给出的详细实现
解耦:将存在于两个实体行为间的强关联去掉。即将抽象化和实现化之间的强关联变换为弱关联,达到解耦的目的。
2.UML与代码实现
1)结构:UML
结构:含有两个等级
抽象化等级结构:由抽象化角色和修正抽象化角色组成
实现化等级结构:由实现化角色和详细实现化角色组成
模式组成:
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个队实现化对象的引用
修正抽象化(RefinedAbstraction)角色:苦熬站抽象化角色,改变和修正父类对抽象化的定义
实现化(Implementor)角色:给出实现化角色的接口,但不给出详细的实现。
详细实现化(ConcreteImplementor)角色:给出实现化角色接口的详细实现
(实现化角色仅仅给出底层操作,而抽象化角色仅仅给出基于底层操作的更高一层的操作。)
2)java代码
public class Bridge{
//client实现
public static void main(String[]args)
{
Abstraction ab = new RefinedAbstraction(); ab.SetImplementor(new ConcreteImplementorA());
ab.Operation(); ab.SetImplementor(new ConcreteImplementorB());
ab.Operation();
}
}
//Implementor类
abstract class Implementor
{
public abstract void Operation();
}
//ConcreteImplementorA和ConcreteImplementorB等派生类
class ConcreteImplementorA extends Implementor
{
public void Operation()
{
System.out.println("详细实现A的方法运行");
}
}
class ConcreteImplementorB extends Implementor
{
public void Operation()
{
System.out.println("详细实现B的方法运行");
}
}
//Abstraction类
class Abstraction
{
protected Implementor implementor;
public void SetImplementor(Implementor implementor)
{
this.implementor=implementor;
}
public void Operation()
{
implementor.Operation();
}
}
//RefinedAbstraction类
class RefinedAbstraction extends Abstraction
{
public void Operation()
{
implementor.Operation();
}
}
3.长处
1)Bridge模式使对象间的组合关系解耦了抽象与实现之间固有的绑定关系。使得抽象和实现客运沿着各自的维度来变化
2)Bridge模式有时候类似于多继承方案,可是多继承往往违背单一职责原则,复用性较差。
它是比多继承方案更好的解决方法
3)一般用在两个很强的变化维度中,假设某个方向的变化维度并不强烈。则不一定要使用Bridge模式
4.应用
1)一个系统须要在构件的抽象化角色和详细化角色之间添加很多其它的灵活性。避免在两个层次间建立静态的联系
2)设计要求实现化角色的不论什么改变不影响client,即实现化角色的改变对client全然是透明的
3)一个构件有多余一个抽象化角色和实现化角色。系统须要他们之间进行动态耦合
4)系统中使用继承没有问题。可是抽象化角色和详细化角色须要独立变化,设计要求独立管理二者
5.其他相关模式
1)装饰模式:为了降低子类的数目,避免出现复杂的继承关系,有两种模式可供选用:桥接模式、装饰模式。
2)建造者模式:由对象的创建所带来的耦合性,能够用建造者模式解决,处理详细问题时可结合二者使用
小结
桥接模式把两个角色之间的继承关系改为聚合关系,从而使二者能够各自独立的变化。把原来在基类的实现化细节抽象出来,再构造到一个实现化的结构中。然后把原来的基类改造成一个抽象化的等级结构,这样就实现了系统在多个维度独立的变化
版权声明:本文博主原创文章,博客,未经同意不得转载。
B桥接模式ridge的更多相关文章
- BridgePattern(桥接模式)
/** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...
- PHP设计模式(八)桥接模式(Bridge For PHP)
一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...
- 设计模式(八)桥接模式(Bridge Pattern)
一.引言 这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视 ...
- 设计模式--桥接模式Bridge(结构型)
一.概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或者多个维度的变化,如何应对这种"多维度的变化",就可以利用桥接模式. 引例: 设想如果要绘制矩形.圆形.椭圆.正方形,我 ...
- vmware中虚拟机与主机ping不通,桥接模式,IP地址在同一网段,无法互ping!
现象描述:网卡选用的桥接模式,IP地址在同一个网段,虚拟机内部可以正常上网,但是Guest OS和Host OS无法互ping! 原因:虚拟机里的防火墙没有关闭,导致禁用ping功能. 解决方法:关闭 ...
- 桥接模式/bridge模式/对象结构型
意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...
- Objective-C 桥接模式 -- 简单实用和说明
桥接模式---把两个相关联的类抽象出来, 以达到解耦的目的 比如XBox遥控器跟XBox主机, 我们抽象出主机和遥控器两个抽象类, 让这两个抽象类耦合 然后生成这两个抽象类的实例XBox & ...
- C#设计模式-桥接模式
这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控 ...
- C#设计模式系列:桥接模式(Bridge)
1.桥接模式简介 1.1>.定义 当一个抽象可能有多个实现时,通常用继承来进行协调.抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现.继承机制将抽象部分与它的实现部分固定在一起,使得 ...
随机推荐
- 内省(一)之Introspector、BeanInfo、PropertyDescriptor
内省(Introspector)是专门用来操作JavaBean属性的.不是所有的字段(Field)都能被称之为属性,只有某些字段具有getXXX或setXXX方法的才能称之为属性,当然要称为是一个Be ...
- Codeforces Round #214 (Div. 2) C. Dima and Salad (背包变形)
C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- nodejs、gulp调试工具node-inspector使用
俗话说欲善其功,必先利其器. 作为目前新型的Web Server开发栈倍受开发者关注的Nodejs来说,调试技术是学习开发的基石,所以对于开始学习Nodejs童鞋来说,Nodejs的调试工具使用是必不 ...
- 【HTML】让<pre>标签文本自动换行
利用<pre></pre>这个标签可以将其包起来的文字排版.格式,原封不动的呈现出来. 也就是说你输入的东西被原封不动的输出,包括你输入的空格之类的,不用 和<BR> ...
- 基于visual Studio2013解决C语言竞赛题之1094纵横图
题目 解决代码及点评 /************************************************************************/ /* ...
- iOS UIButton详细介绍
昨天,做了项目中的一点,觉得细节还是很重要的.像一个普通的UIButton,给它调试字体格式,大小什么的,确实是蛮耗时间的. 今天打算详细的归纳归纳.. typedef NS_ENUM(NSInteg ...
- 我在知乎上关于Laser200/310电脑的文章。
我是30年前从Laser-310起步的,我来回答这个问题. 主要硬件规格: CPU:Z-80A/4.7MHz主频 16K RAM + 2K Video RAM 16K ROM 磁带输出:波特率300 ...
- 【Unity3D自学记录】Unity3D网络之Socket聊天室初探
首先创建一个服务端程序,这个程序就用VS的控制台程序做即可了. 代码例如以下: using System; using System.Collections.Generic; using System ...
- ARP欺骗,骗你没商量
今天BOSS让我总结ARP欺骗的原理和防范策略,在这里把总结的结果贴出来吧.求人品,求速转正. ARP原理: 在局域网内部,各主机之间以MAC地址作为标识通信对象的标志.然而,有时通信发起的主机并不知 ...
- Spring Bean范围 示例
Spring 该目的是通过默认单身创建的对象 设定Bean范围.由Bean美元Scope财产 Scope取值范围: Singleton:单例 proptotype:非单例 Request:创建该Bea ...