Java设计模式笔记之桥梁模式

1.桥梁模式

桥梁模式是对象的结构模式。用意是:将抽象化与实现化脱耦,使得二者可以独立地变化

抽象化是指对对于多个实体抽象出普遍的共性,可以把不同实体当做同样的实体对待。Java中一般接口或者抽象类来表示这种抽象实体。

实现化,针对抽象化实体的具体实现。

这里的脱耦是指,将强关联的继承关系变为弱关联的聚合关系。继承关系在编译器就固定了结构,不如聚合灵活。

2.桥梁模式的结构

结构图如下:

Abstracttion:抽象化角色,抽象层的定义,并保存一个Implementor的引用,所以Java中一般用抽象类定义。

RedefinedAbstraction:扩展抽象化角色,修改或者扩展抽象化的定义。

Implementor:实现化抽象角色,定义了实现化角色的接口,使得在抽象化角色中可以同样使用所有的具体实现化角色。实现化角色一般提供底层接口,而抽象化角色在此基础上实现高层操作

ConcreteImplementor:具体实现化角色。

3.桥梁模式的适用场景

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

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

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

(4)你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

4.一个实例

(1)问题:

Airbus、Boeing和MD都是飞机制造商,他们都生产载客飞机(Passenger Plane)和载货飞机(Cargo Plane)。需要描述这些飞机制造商以及他们所制造的飞机种类。飞机和制造商的关系可以看做实现的关系,而飞机和制造商都需要可以独立变化的,适合使用桥接模式。

(2)类图:


(3)代码

Airplane.java(抽象化角色)

package com.patterns.bridge;

abstract public class Airplane {
    abstract public void fly() ;

    public AirplaneMaker getAirplaneMaker() {
		return airplaneMaker;
	}

	public void setAirplaneMaker(AirplaneMaker airplaneMaker) {
		this.airplaneMaker = airplaneMaker;
	}

	/**
	 *	实现化角色的引用
     */
    private  AirplaneMaker airplaneMaker;
}


PassengerPlane.java

package com.patterns.bridge;

/**
 * 扩展抽象化角色:PassengerPlane
 * @author chenxh
 *
 */
public class PassengerPlane extends Airplane
{
	public void fly()
    {
		System.out.println(this.getAirplaneMaker().produce()+" CargoPlane is flying!");
    }

}

CargoPlane.java

package com.patterns.bridge;

/**
 * 扩展抽象化角色:载货飞机
 * @author chenxh
 *
 */
public class CargoPlane extends Airplane
{
	public void fly()
    {
		System.out.println(this.getAirplaneMaker().produce()+" CargoPlane is flying!");
    }
}

AirplaneMaker.java(实现化角色)

package com.patterns.bridge;

abstract public class AirplaneMaker
{
	
	abstract public String produce();
	
}

Airbus.java

package com.patterns.bridge;

/**
 * 具体实现化角色:Airbus
 * @author chenxh
 *
 */
public class Airbus extends AirplaneMaker
{
	public String produce()
    {
		return "Airbus";
    }
}

Boeing.java

package com.patterns.bridge;

/**
 * 波音飞机,具体实现化角色
 * @author chenxh
 *
 */
public class Boeing extends AirplaneMaker
{
	public String produce()
    {
		return "Boeing";
    }
}

MD.java

package com.patterns.bridge;

/**
 * 具体实现化角色:MD
 * @author chenxh
 *
 */
public class MD extends AirplaneMaker
{
	public String produce()
    {
		return "MD";
		
    }
}


Client.java(测试代码)

package com.patterns.bridge;

public class Client {

	public static void main(String[] args) {
		
		CargoPlane cargoPlane = new CargoPlane();
		cargoPlane.setAirplaneMaker(new Boeing());
		cargoPlane.fly();
		
		PassengerPlane passengerPlane = new PassengerPlane();
		passengerPlane.setAirplaneMaker(new MD());
		passengerPlane.fly();
		

	}

}

输出:

Boeing CargoPlane is flying!
MD CargoPlane is flying!






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值