设计模式:桥梁模式

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


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

  • Default Adapter 模式
  • Adapter 模式
  • Bridge 模式
  • Composite 模式
  • Decorator 模式
  • Facade 模式
  • Flyweight 模式
  • Proxy 模式

问题

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

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

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

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

设计模式:桥梁模式_第1张图片

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

实现大类

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 !


你可能感兴趣的:(设计模式,桥梁模式)