设计模式7——桥接模式


电视机与遥控器

        有两种遥控器,蓝牙与红外线。有很多品牌的电视,每种遥控器控制一种电视。根据上面的描述我们很快想到一种实现方式,将遥控器设为一个父类,不同的遥控器去继承扩展他。

 

简单的继承:

 

从上图可以看出,有2种遥控器,有3种品牌的电视,一共需要2*3=6个子类。假如遥控器种类是N,电视品牌种类是M,那么最终需要的子类是N*M

缺点:

1. 这样的实现方式会使得我们的子类非常的多,代码量会增大。

2. 如果父类有修改,所有的子类都有可能需要修改,修改量大,不方便后续维护。

 

使用桥接模式做优化:

 

抽象出1个基类和1个接口。

优点:

1. 最终需要的子类是N+M,减少了代码量。

2. 类图好看,分层清晰,一目了然。父类有修改也不会影响所有的子类。

 

定义与UML

定义:将抽象部分与实现部分分离,使他们都可以独立的变化。

 

我们可以这样理解:

Client: 客户端,调用的类。

Abstraction: 抽象类,维护对行为实现的引用(调用ConcreteImplementor的实现)。

RefinedAbstraction: 抽象类的子类,重写父类的实现。

Implementor: 接口,行为实现的接口(Abstraction中定义了存在的操作)。

ConcreteImplementor: 实现Implementor的行为。

 

代码分析

1)首先我们定义了遥控器的抽象类和电视的行为

Abstraction

public abstract class AbstractRemoteConctol {
	private ITV mTV;

	public AbstractRemoteConctol(ITV pTV) {
		mTV = pTV;
	}

	public void powerOnTV() {
		mTV.powerOn();
	}
}

Implementor

public interface ITV {
	public void powerOn();
}

(2)然后我们分别实现不同品牌的电视的行为

ConcreteImplementor

public class SonyTV implements ITV {
	@Override
	public void powerOn() {
		System.out.println("Sony TV 已经启动。");
	}
}

public class SamSungTV implements ITV {
	@Override
	public void powerOn() {
		System.out.println("Samsung TV 已经启动。");
	}
}


(3)实现抽象类的子类

RefinedAbstraction

public class IRRC extends AbstractRemoteConctol {
	public IRRC(ITV pTV) {
		super(pTV);
	}

	public void powerOn() {
		System.out.println("使用红外线遥控器");
		powerOnTV();
	}
}

public class BluetoothRC extends AbstractRemoteConctol {
	public BluetoothRC(ITV pTV) {
		super(pTV);
	}

	public void powerOn() {
		System.out.println("使用蓝牙遥控器");
		powerOnTV();
	}
}

(4)最后试客户端的调用 

public class BridgeTest {
	public static void main(String[] args) {
		ITV samsumgTV = new SamSungTV();
		
		BluetoothRC bluetoothRC = new BluetoothRC(samsumgTV);
		bluetoothRC.powerOn();
		
		IRRC irRC = new IRRC(samsumgTV);
		irRC.powerOn();
	}
}

打印如下:

使用蓝牙遥控器

Samsung TV 已经启动。

使用红外线遥控器

Samsung TV 已经启动。


代码下载地址:https://github.com/bird7310/DesignPatternExample.git

包名:com.ahacool.designpattern.bridge


 

实际应用

        MVC模式,表现层通过接口调用逻辑层,表现层的变化不会影响逻辑层;逻辑层通过接口调用数据层,逻辑层的变化不会影响数据层。

 

总结

        代码之前写好了,后头看的时候还能理解,但是发现这个模式自己理解也不是非常透彻。于是上网找别人的介绍,找到好的例子拿来使用。现在看来说的还算明白,但是关于使用场景和实际应用部分其实可以再深入,不过这样做的话,时间又得花很多。

        文章的粗体和红色使用比较多,希望突出重点,第一次这样尝试,后续文章针对效果做优化。

        待以后再完善使用场景和实际应用。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值