桥梁模式(Bridge)

桥梁模式属于结构类的设计模式,示意结构图如下:

桥梁模式所涉及的角色有:

  ●  抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。

  ●  修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。

  ●  实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。

  ●  具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现。

关键点:

1、抽象化角色可以通过向不同的实现化对象委派达到动态转换自己的目的

2、抽象化角色和实现化角色之间是聚合关系,而不是继承关系

如果 一个类需要知道另一个类的属性和方法,可以选择继承,也可以选择组合(聚合),在使用组合时,则需要持有对方的引用

以一个万能遥控的例子说明该模式的应用:(为了在同一个文件共存,代码中类前面的public都省略了)

  1 package designpatterns.strucural;
  2
  3 //抽象角色--Abstraction
  4 abstract class AbstractRemoteControl {
  5
  6     protected ITV tv;
  7
  8     public void bindImpl(ITV tv){
  9         this.tv = tv;
 10     }
 11
 12     public void turnOn(){
 13         tv.on();
 14     }
 15
 16     public void turnOff(){
 17         tv.off();
 18     }
 19
 20     public void setChannel(int channel){
 21         tv.switchChannel(channel);
 22     }
 23 }
 24 //精确抽象角色--RefinedAbstraction
 25 class PcRemoteControl extends AbstractRemoteControl {
 26
 27     @Override
 28     public void turnOn() {
 29         System.out.println("Pc On");
 30     }
 31 }
 32
 33 class CommonRemoteControl extends AbstractRemoteControl{
 34
 35     @Override
 36     public void turnOn() {
 37         super.turnOn();
 38     }
 39
 40     @Override
 41     public void turnOff() {
 42         super.turnOff();
 43     }
 44
 45     @Override
 46     public void setChannel(int channel) {
 47         super.setChannel(channel);
 48     }
 49 }
 50
 51 //实现角色--mplementor
 52 /*
 53  * 首先定义电视机的接口:ITV*/
 54 interface ITV {
 55
 56     public void on();
 57     public void off();
 58     public void switchChannel(int channel);
 59 }
 60 //具体实现角色--ConcreteImplementor1
 61 /*
 62  * 再实现三星的ITV接口。*/
 63 class SamsungTV implements ITV {
 64     @Override
 65     public void on() {
 66         System.out.println("Samsung is turned on.");
 67     }
 68
 69     @Override
 70     public void off() {
 71         System.out.println("Samsung is turned off.");
 72     }
 73
 74     @Override
 75     public void switchChannel(int channel) {
 76         System.out.println("Samsung: channel - " + channel);
 77     }
 78 }
 79 //具体实现角色--ConcreteImplementor2
 80 /*
 81 * 再实现索尼的ITV接口。*/
 82 class SonyTV implements ITV {
 83
 84     @Override
 85     public void on() {
 86         System.out.println("Sony is turned on.");
 87     }
 88
 89     @Override
 90     public void off() {
 91         System.out.println("Sony is turned off.");
 92     }
 93
 94     @Override
 95     public void switchChannel(int channel) {
 96         System.out.println("Sony: channel - " + channel);
 97     }
 98 }
 99
100 //测试类
101 public class Bridge {
102     public static void main(String[] args){
103         ITV tv1 = new SonyTV();
104         ITV tv2 = new SamsungTV();
105
106         AbstractRemoteControl control = new CommonRemoteControl();
107         control.bindImpl(tv1);
108         control.turnOn();
109         control.bindImpl(tv2);
110         control.turnOn();
111
112         AbstractRemoteControl control_pc = new PcRemoteControl();
113         control_pc.turnOn();
114     }
115 }

验证输出:

Sony is turned on.
Samsung is turned on.
Pc On

代码说明:

抽象化角色:远程控制,通过持有ITV接口实例,达到对电视万能控制

修正抽象化角色:pc的远程控制,有朝一日,电视消失了,证明抽象化角色还可以复用

实现化角色:ITV ,这个可以定义为抽象类,也可以定义为接口,个人倾向定义为接口,毕竟代码量少

具体实现化角色:各品牌的电视

何时持有对方引用?

阎宏博士java与模式一书省略了这一点,不少博客的例子是通过构造函数传参的方式获取对方引用,也许是为了图省事儿

我觉得恰是这些省略让人不太好体会这个模式的特点,因为这么干就说不清楚和抽象工厂模式的区别了,像下面的代码

Animal A = new cat()
A.run()
Animal B = new dog()
B.run()

持有对方引用通过调用一个普通方法

public void bindImpl(ITV tv){
        this.tv = tv;
    }

这样就只需要有一个实例,通过绑定不同的实现化对象,达到动态转换自己功能

类似于现实中,你有一个万能遥控器,通过点击某个电视品牌,你就能实现对具体电视的控制

参考:

《JAVA与模式》之桥梁模式

设计模式:桥接模式(Bridge)

时间: 2024-08-03 03:12:03

桥梁模式(Bridge)的相关文章

说说设计模式~桥梁模式(Bridge)

返回目录 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式. 意图 [GOF95]在提出桥梁模式的时候指出,桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化".这句话有三个关键词,也就是抽象化.实现化和脱耦. 桥梁模式的成员 抽象化 存在于多个实体中

java设计模式之桥梁模式(Bridge)

1.桥梁模式 与 策略模式 非常相似 (其实很多设计模式都相似,因为所有的模式都是按照设计原则 而设计出来的,设计原则就相当于武功的心法,设计模式就是招式,只要心法过硬,就可以无招胜有招了.) 这里也有比较详细的说明 策略模式 VS 桥梁模式 (画画,使用蜡笔和使用毛笔以及颜料的区别) 好了,这里先说 桥梁模式,最后再总结两者的区别 2.桥梁模式(还是那样,设计模式就是为了代码健壮,代码重用,所以高内聚,低耦合永远都是那么受欢迎,什么抽象类啊,接口啊···) 场景,农民施肥. 这里农民类 调用

桥梁模式(Bridge Pattern)

桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”. 桥梁模式的用意 桥梁模式虽然不是一个使用频率很高的模式,但是熟悉这个模式对于理解面向对象的设计原则,包括“开-闭”原则以及组合/聚合复用原则都很有帮助.理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格.桥梁模式的用意是“将抽象化(Abstraction

变脸不变质的桥梁模式(Bridge Pattern)

有一哥们是搞山寨货的,什么流行就搞什么.自己有个厂子,前些时间服装挣钱,就生产衣服,现在搞手机挣钱,搞手机,这哥们很聪明,就换了个产品,工人,厂房都不变.他是怎么做到的?用类图来模拟一下: 由类图可以看出这哥现有两家公司,一个搞房地产,一个搞山寨货(phone),房地产是长久渠道,山寨随时可能变更. 用PHP来实现: <?php abstract class Corp { private $product; public function __construct( Product $produc

Java设计模式(五)外观模式 桥梁模式

(九)外观模式 外观模式为子系统提供一个接口,便于使用.解决了类与类之间关系的,外观模式将类之间的关系放在一个 Facade 类中,降低了类类之间的耦合度,该模式不涉及接口. class CPU { public void startup(){ System.out.println("cpu start"); } public void shutdown(){ System.out.println("cpu stop"); } } class Memory { pu

设计模式之禅之设计模式-桥梁模式

一:桥梁模式定义        --->桥梁模式(Bridge Pattern)也叫做桥接模式,是一个比较简单的模式        --->将抽象和实现解耦,使得两者可以独立地变化. 二:桥梁模式角色 ● Abstraction——抽象化角色        它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类.● Implementor——实现化角色        它是接口或者抽象类,定义角色必需的行为和属性.● RefinedAbstraction——修正抽象

我的设计模式:工厂模式和桥梁模式

1.简单工厂模式  Factory Method Pattern 能生产某类(接口管理)东东,可以指定特定的类 延迟初始化:     使用全局变量Map减少类的初始化过程 获取接口下的全部实现类:ClassUtils 2.抽象工厂模式  Abstract Factory Patter 问题:人类中分男和女   人类的喜怒哀乐情绪 产品等级和产品族 工厂(接口   抽象类(共性)   实现类(个性))       人类(接口   抽象类(共性)  实现类(个性)) 3.桥梁模式  Bridge P

24种设计模式--桥梁模式【Bridge Pattern】

今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都很赚钱,天天帮我在累加财富,其实是什么公司我倒是不关心,我关心的是是不是在赚钱,赚了多少,我先用类图表示一下我这两个公司: 类图很简单,声明了一个 Corp 抽象类,定义一个公司的抽象模型,公司首先要是赚钱的,不赚钱谁开公司,做义务或善举那也是有背后利益支撑的,我还是赞这句话“天下熙熙,皆为利来:天下壤壤,皆为利往”,那我们先看 Corp 类的源代码: 1 package com.pat

桥梁(Bridge)模式

桥梁(Bridge)模式:桥梁模式是一个非常有用的模式,也是比较复杂的一个模式.熟悉这个模式对于理解面向对象的设计原则,包括"开-闭"原则(OCP)以及组合/聚合复用原则(CARP)都很有帮助.理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格 /* * 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用. * 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义. * 实现化(Implem