设计模式:桥梁模式

原文地址:http://leihuang.org/2014/12/08/bridge/

Structural 模式 如何设计物件之间的静态结构,如何完成物件之间的继承、实 现与依赖关系,这关乎着系统设计出来是否健壮(robust):像是易懂、易维护、易修改、耦合度低等等议题。Structural 模式正如其名,其分类下的模式给出了在不同场合下所适用的各种物件关系结构。


问题

假设现在有一些电影供用户选择,分类有动作片,爱情片,科幻片...它们又分为国产影片,美国电影,日韩电影.如果让你去实现一个客户端供用户选择要看哪一类别电影,你会如何做呢?

所有种类都呈现出来?还是将两种不同性质的分类区分开来,然后俩俩组合呢?明显是后者.因为这样更简洁吗.但是我们在平常编程的时候,就很容易写成第一种实现.如下面的类结构图.

从上面的类图中我们可以看出,假如现在多增加了悬疑片的话,那么就需要在每一个国家类下面多加上一个子类,如果多一个国家的话就又需要多实现一次IMovie接口.这样导致整个涉及非常臃肿.

所以我们就使用第二种方案,也就是桥梁模式.我们将不同地区分为抽象类别,而动作片,爱情片,科幻片分为实现类别一类.类图结构如下.

图中的聚合关系的那条线就是桥梁.

实现大类

public interface IMovieImplementor {
    public void show(String region) ;//播放电影
}

动作片类别

public class ActionMovie implements IMovieImplementor {
    private String property = "动作片" ;

    @Override
    public void show(String region) {
        System.out.println(region+"--->"+property);
    }
}

爱情片类别

public class LoveMovie implements IMovieImplementor {
    private String property = "爱情片" ;

    @Override
    public void show(String region) {
        System.out.println(region+"--->"+property);

    }
}

科幻电影类别

public class ScienceMovie implements IMovieImplementor {
    private String property = "科幻片";

    @Override
    public void show(String region) {
        System.out.println(region+"--->"+property);
    }
}

抽象大类

public abstract class RegionAbstract {
    private IMovieImplementor movie = null ;
    protected RegionAbstract(IMovieImplementor movie){
        this.movie = movie ;
    }

    protected abstract void request() ;

    protected IMovieImplementor getImp(){
        return movie ;
    }
}

国产电影类别

public class ChineseMovie extends RegionAbstract {
    protected ChineseMovie(IMovieImplementor movie) {
        super(movie);
    }

    @Override
    protected void request() {
        super.getImp().show("国产");
    }
}

美国电影类别

public class AmericanMovie extends RegionAbstract {
    protected AmericanMovie(IMovieImplementor movie) {
        super(movie);
    }

    @Override
    protected void request() {
        super.getImp().show("美国");
    }
}

日韩电影类别

public class JapaneseMovie extends RegionAbstract {
    protected JapaneseMovie(IMovieImplementor movie) {
        super(movie);
    }
    @Override
    protected void request() {
        super.getImp().show("日韩");
    }
}

客户端 类

public class Client {
    public static void main(String[] args) {
        IMovieImplementor movieProperty = new ActionMovie() ; //选的时动作片

        RegionAbstract movieRegion = new ChineseMovie(movieProperty) ;//选的时国产的
        movieRegion.request();  //print : 国产--->动作片
    }
}

简单概括下桥梁模式:就是将所有的分类分为两个大类(一个为抽象类别,一个为实现类别),然后在两个大类之间建立一座桥梁,通常通过聚合关系来建立桥梁.

这篇文章还不错,可以看看.点这里.



2014-12-08 23:08:53

Brave,Happy,Thanksgiving !

时间: 2024-11-02 14:54:53

设计模式:桥梁模式的相关文章

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

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

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

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

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

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

设计模式 桥梁模式 JDBC

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

设计模式——桥梁模式

桥梁模式定义 将抽象和实现解耦,使得二者可以独立变化 所谓耦合,就是两个实体的行为的某种强关联.而将它们的强关联去掉,就是耦合的解脱,或称脱耦.在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联. 将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联.因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化.这就是桥梁模式的用意. 桥接模式角色 1.Abstrac

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

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

设计模式之桥梁模式20170721

行为型设计模式之桥梁模式: 一.含义 桥梁模式也叫做桥接模式,其定义如下: 将抽象和实现解耦,使得两者可以独立地变化. 只要记住一句话就行:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的. 二.代码说明 1.主要有四个角色 1)抽象化角色 它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类 2)实现化角色 它是接口或者抽象类,定义角色必须的行为和属性 3)修正抽象化角色 它引用实现化角色对抽象化角色进行修正 4)具体实现化角色 它实现接口或抽象

设计模式——桥梁(桥接)模式

一.定义 将抽象和实现解耦,使得两者可以独立地变化 二.适用场景 重用性要求较高的场景 接口或抽象类不稳定的场景 三.注意事项 并非涉及继承就要用桥梁模式,如果发现继承有N层的时候,可以考虑使用 四.模式中的角色 Abstraction 抽象化角色 Implementor 实现化角色 RefinedAbstraction 修正抽象化角色 ConcreteImplementor 具体实现化角色 用法:抽象角色引用实现角色 五.模式的优点 抽象与实现分离 优秀的扩充能力 实现细节对客户透明(抽象层通

设计模式之桥梁模式

桥梁模式亦是结构型设计模式的一种,从名字上理解,像是连接两个元素的一种模式,差不多可以这么理解,但桥梁模式并非是像适配器模式一样适配不适应的两个类的. 桥梁模式连接的抽象和实现,为了达到抽象和实现这两部分都能变化的目的,必须使用桥梁的聚合作用来达到.这里的抽象部分和实现部分不是我们通常认为的抽象父类和实现子类的关系,而是组合关系.实现部分是被抽象部分调用,以用来完成(实现)抽象部分的功能. 系统设计中,总是充满了变数,那么采取什么样的设计能较好的解决变化带给系统的影响?一般来说,设计原则是将不变