原文地址: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 !