设计模式之桥接模式(Bridge Pattern)

文章目录

  • 一、导读
    • 1.1、桥接模式产生的背景
  • 二、桥接模式的定义
  • 三、角色和UML类图
    • 3.1、角色
    • 3.2、UML类图
  • 四、示例
    • 4.1、需求:
    • 4.2、UML类图
    • 4.3、代码:
      • 1、Brand :行为接口
      • 2、Vivo 、XiaoMi :行为接口的实现类
      • 3、手机 Phone:抽像类
      • 4、FoldedPhone 折叠式:是Abstraction 实现类
      • 5、UpRightPhone 直板手机:是Abstraction 实现类
      • 6、测试
      • 7、运行结果:

一、导读

1.1、桥接模式产生的背景

以手机为例,对不同手机类型的、不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图:
设计模式之桥接模式(Bridge Pattern)_第1张图片

传统方案解决手机使用问题(类图):
设计模式之桥接模式(Bridge Pattern)_第2张图片

问题分析

1)扩展性问题(类爆炸),如果我们再增加手机的样式(直板、旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。

2)违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本。

3)解决方案——使用桥接模式。

二、桥接模式的定义

桥接模式,将 实现抽象 放在两个不同的类层次中,使两个层次可以独立改变。

更容易理解的表述是:桥接模式将 继承 关系转换为 关联 关系,从而降低了类与类之间的耦合,减少了代码编写量。

  • 桥接模式,是一种结构型设计模式

  • 桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现( Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。

三、角色和UML类图

3.1、角色

  1. Implementor:行为接口;
  2. ConcreteImplementorA、B:行为接口的具体实现类;
  3. Abstraction :抽像类,维护 Implementor,即它的实现类 ConcreteImplementorA、B ,二者是聚合关系,又充当桥接类;
  4. RefinedAbstraction: 是 Abstraction 抽象类的子类,
    从UML图看出,Abstraction 和 Implementor 是聚合的关系,其实是调用和被调用的关系。
  5. Client类: 桥接模式的调用者、测试类;

3.2、UML类图

设计模式之桥接模式(Bridge Pattern)_第3张图片

四、示例

4.1、需求:

4.2、UML类图

设计模式之桥接模式(Bridge Pattern)_第4张图片

4.3、代码:

1、Brand :行为接口

//接口
public interface Brand {
	void open();
	void close();
	void call();
}

2、Vivo 、XiaoMi :行为接口的实现类

/**
 * Vivo手机
 */
public class Vivo implements Brand {

	@Override
	public void open() {
		System.out.println("Vivo手机开机 ");
	}

	@Override
	public void close() {
		System.out.println("Vivo手机关机 ");
	}

	@Override
	public void call() {
		System.out.println("Vivo手机打电话 ");
	}
}


/**
 * 小米手机
 */
public class XiaoMi implements Brand {

	@Override
	public void open() {
		System.out.println("小米手机开机 ");
	}

	@Override
	public void close() {
		System.out.println("小米手机关机 ");
	}

	@Override
	public void call() {
		System.out.println("小米手机打电话 ");
	}
}

3、手机 Phone:抽像类

public abstract class Phone {
	
	//组合品牌
	private Brand brand;

	//构造器
	public Phone(Brand brand) {
		super();
		this.brand = brand;
	}
	
	protected void open() {
		this.brand.open();
	}
	protected void close() {
		brand.close();
	}
	protected void call() {
		brand.call();
	}	
}

4、FoldedPhone 折叠式:是Abstraction 实现类

/**
 * 折叠式手机类,继承 抽象类 Phone
 * 注意:重写方法时,全部调用父类的方法
 */
public class FoldedPhone extends Phone {

	//构造器
	public FoldedPhone(Brand brand) {
		super(brand);
	}
	
	public void open() {
		super.open();
		System.out.println("折叠样式手机");
	}
	
	public void close() {
		super.close();
		System.out.println("折叠样式手机");
	}
	
	public void call() {
		super.call();
		System.out.println("折叠样式手机");
	}
}

5、UpRightPhone 直板手机:是Abstraction 实现类

/**
 * 直板手机
 * 注意:重写方法时,全部调用父类的方法
 */
public class UpRightPhone extends Phone {

	// 构造器
	public UpRightPhone(Brand brand) {
		super(brand);
	}

	public void open() {
		super.open();
		System.out.println("直板样式手机");
	}

	public void close() {
		super.close();
		System.out.println("直板样式手机");
	}

	public void call() {
		super.call();
		System.out.println("直板样式手机");
	}
}

6、测试

public class Main {

	public static void main(String[] args) {
		
		//获取折叠式手机 (样式 + 品牌 )
		Phone phone1 = new FoldedPhone(new XiaoMi());
		
		phone1.open();
		phone1.call();
		phone1.close();
		
		System.out.println("=======================");
		
		Phone phone2 = new FoldedPhone(new Vivo());
		
		phone2.open();
		phone2.call();
		phone2.close();
		
		System.out.println("==============");
		
		
		//直板手机,小米
		UpRightPhone phone3 = new UpRightPhone(new XiaoMi());
		
		phone3.open();
		phone3.call();
		phone3.close();
		
		System.out.println("==============");
		//直板手机,Vivo
		UpRightPhone phone4 = new UpRightPhone(new Vivo());
		
		phone4.open();
		phone4.call();
		phone4.close();
	}
}

7、运行结果:

小米手机开机
折叠样式手机
小米手机打电话
折叠样式手机
小米手机关机
折叠样式手机
=======================
Vivo手机开机
折叠样式手机
Vivo手机打电话
折叠样式手机
Vivo手机关机
折叠样式手机
==============
小米手机开机
直板样式手机
小米手机打电话
直板样式手机
小米手机关机
直板样式手机
==============
Vivo手机开机
直板样式手机
Vivo手机打电话
直板样式手机
Vivo手机关机
直板样式手机

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