结构型模式-桥接模式

 

1.概述

1.1 定义

          桥接模式的用意就是将抽象化实现化进行解耦,将抽象部分与它的实现部分分离,使得它们都可以独立的变化

1.2 合成/聚合复用原则

           合成和聚合都是关联的特殊种类,其原则就是尽量使用合成/聚合,尽量不要使用类继承。

1.2.1 聚合

          聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分。

1.2.2 合成

         合成则是一种强的拥有关系,体现了严格的部分与整体的关系,部分与整体的生命周期是一样的。

1.2.3 举例

         比如大雁有两个翅膀,其翅膀和大雁是部分与整体的关系,并且它们的生命周期是一样的,所以说大雁和翅膀就是合成关系;而大雁和种群属于聚合关系,每只大雁属于一个种群,一个种群可以有多只大雁。类图如下所示:

1.3 继承

        盲目使用继承可能会造成麻烦,继承是一种强耦合的结构父类改变,其子类就会随着改变。所以在使用继承的时候,一定要是在 “is - a” 的关系时再考虑使用而不是在任何时候都使用继承

2.类图

 

3.角色

1.Abstraction(抽象类)定义了抽象类的接口,并维护抽象实现类。
2.RefinedAbstraction(扩充的抽象类)它扩充由Abstraction定义的接口
3.Implementor(抽象实现类接口)用于定义实现类的接口
4.ConcreteImplementor具体的实现类

 

4.案例

4.1 说明

        这里以手机品牌和手机软件为案例。手机品牌有不同的种类,其手机软件同样也有不同的种类。为不同品牌的手机添加不同种类的手机软件。

4.2 类图

        手机品牌的类图如下所示:

        手机软件的类图如下所示:

      二者合并后的类图如下所示:

4.3 代码

手机软件抽象类:

/**
 * 手机软件抽象类
 * @author Administrator
 */
abstract class HandsetSoft {

	public abstract void add();
}

手机游戏软件具体实现类:

/**
 * 手机游戏具体实现类
 * @author Administrator
 */
public class HandsetGame extends HandsetSoft{
	@Override
	public void add() {
		System.out.println("添加手机游戏软件!");
	}	
}

手机通讯录软件具体实现类:

/**
 * 手机通讯录具体实现类
 * @author Administrator
 */
public class HandsetAddressList extends HandsetSoft{
	@Override
	public void add() {
		System.out.println("添加手机通讯录软件!");
	}
}

手机品牌抽象类:

/**
 * 手机品牌抽象类
 * @author Administrator
 */
abstract class HandsetBrand {
	//拥有手机软件对象
	protected HandsetSoft soft;
	//设置手机软件
	public void setHandsetSoft(HandsetSoft soft) {
		this.soft = soft;
	}
	//运行软件
	public abstract void add();
}

手机品牌A具体实现类:

/**
 * 手机品牌A具体实现类
 * @author Administrator
 */
public class HandsetBrandA extends HandsetBrand{
	@Override
	public void add() {
		System.out.print("为手机品牌A:");
		soft.add();
	}
}

手机品牌B具体实现类:

/**
 * 手机品牌B具体实现类
 * @author Administrator
 */
public class HandsetBrandB extends HandsetBrand{
	@Override
	public void add() {
		System.out.print("为手机品牌B:");
		soft.add();
	}
}

客户端类:

/**
 * 客户端类
 * @author Administrator
 */
public class Client {
	public static void main(String[] args) {
		//创建手机品牌B对象
		HandsetBrand b = new HandsetBrandB();
		//为手机品牌B添加游戏软件
		b.setHandsetSoft(new HandsetGame());
		b.add();
		//为手机品牌B添加通讯录软件
		b.setHandsetSoft(new HandsetAddressList());
		b.add();
		
		//创建手机品牌A对象
		HandsetBrand a = new HandsetBrandA();
		//为手机品牌B添加游戏软件
		a.setHandsetSoft(new HandsetGame());
		a.add();
		//为手机品牌B添加通讯录软件
		a.setHandsetSoft(new HandsetAddressList());
		a.add();	
	}
}

运行结果:

为手机品牌B:添加手机游戏软件!
为手机品牌B:添加手机通讯录软件!
为手机品牌A:添加手机游戏软件!
为手机品牌A:添加手机通讯录软件!

4.4 总结

       如果使用继承的方式去实现上述功能的话,会造成大量类的增加,不能满足开放封闭原则。如果系统中有多种分类,且每种分类都有多种变化的话,那么就采用桥接模式,让这些变化独立的进行变化,减少它们的耦合。

 

5.优缺点

5.1 优点

1.将抽象与实现分离,提高了系统的可扩展性。
2.其实现细节对客户透明。

5.2 缺点

由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckyliuqs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值