[设计模式-结构型]桥接(Bridge )
发布日期:2021-07-01 05:47:46 浏览次数:2 分类:技术文章

本文共 3574 字,大约阅读时间需要 11 分钟。

概括

名称

Bridge

结构

动机

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

适用性

  • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。

  • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时B r i d g e 模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

  • 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

  • (C + +)你想对客户完全隐藏抽象的实现部分。在C + +中,类的表示在类接口中是可见的。

  • 有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。R u m b a u g h 称这种类层次结构为?嵌套的普化?(nested generalizations )。

  • 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。一个简单的例子便是C o p l i e n 的S t r i n g 类[ C o p 9 2 ],在这个类中多个对象可以共享同一个字符串表示(S t r i n g R e p )。

解析

形象比喻:

BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了

  桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

    1.Abstraction

      定义抽象类的接口。
      维护一个指向Implementor类型对象的指针。
    2.RefinedAbstraction
      扩充由Abstraction定义的接口。
    3.Implementor
      定义实现类的接口,该接口不一定要与Abstraction的接口完全一致。
      事实上这两个接口可以完全不同。
      一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
    4.ConcreteImplementor
      实现Implementor接口并定义它的具体实现。

实例

这里的例子是有 软件产品和硬件产品两类产品,与金属包装和塑料包装两类包装。

使用桥接模式将产品类和包装类结合起来,就可以使用四种状况了:

软件金属包装

软件塑料包装

硬件金属包装

硬件塑料包装

涉及的文件有:

Product.java

  -- SoftwareProduct.java

  --  HardwareProduct.java

Package.java

  -- MetalPackage.java

  -- PlasticPackage.java

TestMain.java

/**    * @author oscar999    * @date 2013-7-24 * @version V1.0    */package designptn.bridge;public abstract class Product {	private String type;	/**	 * @return the type	 */	public String getType() {		return type;	}	/**	 * @param type	 *            the type to set	 */	public void setType(String type) {		this.type = type;	}}
/**    * @author oscar999    * @date 2013-7-24 * @version V1.0    */package designptn.bridge;public class SoftwareProduct extends Product {	public SoftwareProduct() {		setType("Software");	}		public void pack(Package package0)	{		package0.packProduct(this);	}}
/**    * @author oscar999    * @date 2013-7-24 * @version V1.0    */package designptn.bridge;public class HardwareProduct extends Product {	public HardwareProduct() {		setType("Hardware");	}	public void pack(Package package0) {		package0.packProduct(this);	}}
/**    * @author oscar999    * @date 2013-7-24 * @version V1.0    */package designptn.bridge;public abstract class Package {	public abstract void packProduct(Product product);}
/**    * @author oscar999    * @date 2013-7-24 * @version V1.0    */package designptn.bridge;public class MetalPackage extends Package {	/*	 * (non-Javadoc)	 * 	 * @see designptn.bridge.Package#packProduct(designptn.bridge.Product)	 */	@Override	public void packProduct(Product product) {		// TODO Auto-generated method stub		System.out.println(product.getType() + " pack Metal Package");	}}
/**    * @author oscar999    * @date 2013-7-24 * @version V1.0    */package designptn.bridge;public class PlasticPackage extends Package {	/*	 * (non-Javadoc)	 * 	 * @see designptn.bridge.Package#packProduct(designptn.bridge.Product)	 */	@Override	public void packProduct(Product product) {		// TODO Auto-generated method stub		System.out.println(product.getType() + " pack Plastic Package");	}}
/**    * @author oscar999    * @date 2013-7-24 * @version V1.0    */package designptn.bridge;public class TestMain {	/**	 * @param args	 */	public static void main(String[] args) {		// TODO Auto-generated method stub		Product sProduct = new SoftwareProduct();		Product hProduct = new HardwareProduct();		Package mPackage = new MetalPackage();		Package pPackage = new PlasticPackage();				mPackage.packProduct(sProduct);		pPackage.packProduct(sProduct);				mPackage.packProduct(hProduct);		pPackage.packProduct(hProduct);	}}

转载地址:https://oscar.blog.csdn.net/article/details/9376027 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:[设计模式-结构型]组合(Composite )
下一篇:[设计模式-结构型]适配器(Adapter)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月20日 15时57分26秒