设计模式之桥接模式

设计模式之桥接模式

1. 什么是桥接模式

Bridge 模式又叫做桥接模式,是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

桥接模式的一般结构:

在这里插入图片描述

  • ClientBridge:模式的使用者

  • Abstraction:抽象类接口(接口或抽象类)维护对行为实现(Implementor)的引用

  • Refined Abstraction:Abstraction子类

  • Implementor:行为实现类接口 (Abstraction接口定义了基于Implementor接口的更高层次的操作)

  • ConcreteImplementor: Implementor子类

2. 具体实例

以一个遥控器项目为例来看一下桥接模式的使用,遥控器,就是几个功能开关,上下换台。

首先看一种设计方案,就是统一设计一个接口,然后不同的厂家去扩展继承他。

在这里插入图片描述

这种设计是可以实现目前的需求的,但是有什么问题呢?就是我现在要添加一个新的厂家,然后新的厂家呢增加了新的功能,这时候要是在继承统一的接口的话就不够了,需要修改具体的厂家类,还需要设计自己的类。

那我们使用桥接模式怎么设计呢?类图如下:

在这里插入图片描述

桥接模式就是把实现和抽象放在两个不同的类层次中,使得两个层次可以独立改变。这里就是设计了两个层次,一个是具体的遥控器,一个是生产的厂家,通过Control接口来桥接。这样的话就具体的遥控器就可以使用这个接口来使用厂家的方法,不用管顶层,解耦合了。容易扩展和维护。

具体的代码实现:

Control 接口:

public interface Control {
	
	public void On();
	public void Off();
	public void setChannel(int ch);
	public void setVolume(int vol);

}

生产厂家类:

public class LGControl implements Control {

	@Override
	public void On() {
		// TODO Auto-generated method stub
		System.out.println("**Open LG TV**");
	}

	@Override
	public void Off() {
		// TODO Auto-generated method stub
		System.out.println("**Off LG TV**");
	}

	@Override
	public void setChannel(int ch) {
		// TODO Auto-generated method stub
		System.out.println("**The LG TV Channel is setted "+ch+"**");
	}

	@Override
	public void setVolume(int vol) {
		// TODO Auto-generated method stub
		System.out.println("**The LG TV Volume is setted "+vol+"**");
	}

}

其余的同理,就不再贴代码了,太多了。

TVControl抽象类:

public abstract class TvControlabs {

	  Control mControl=null;
	public TvControlabs(Control mControl)
	{
		this.mControl=mControl;
	}
	
	public abstract void Onoff();
	public abstract void nextChannel();
	public abstract void preChannel();		
}

TVControl抽象类的具体实现:

public class TvControl extends TvControlabs {
	private  int ch=0;
	private  boolean ison=false;
	
	public TvControl(Control mControl)
	{
		super(mControl);
	}
	@Override
	public void Onoff() {
		// TODO Auto-generated method stub

		if(ison)
		{
			ison=false;
			mControl.Off();
		}else{
			ison=true;
			mControl.On();
		}
	
	}

	@Override
	public void nextChannel() {
		// TODO Auto-generated method stub

		ch++;
		mControl.setChannel(ch);
	
	}

	@Override
	public void preChannel() {
		// TODO Auto-generated method stub

		ch--;
		if(ch<0)
		{
			ch=200;
		}
		mControl.setChannel(ch);
	
	}
}

再有新的TVControl的具体实现的时候同理。

测试类:

public class MainTest {
	public static void main(String[] args) {
		TvControl mLGTvControl;
		TvControl mSonyTvControl;
		mSonyTvControl=new TvControl(new SonyControl());
		mLGTvControl=new TvControl(new LGControl());
		mLGTvControl.Onoff();
		mLGTvControl.nextChannel();
		mLGTvControl.nextChannel();
		mLGTvControl.preChannel();
		mLGTvControl.Onoff();
		
		mSonyTvControl.Onoff();
		mSonyTvControl.preChannel();
		mSonyTvControl.preChannel();
		mSonyTvControl.preChannel();
		mSonyTvControl.Onoff();
		
		newTvControl mSharpTvControl;
		mSharpTvControl=new newTvControl(new SharpControl());
		mSharpTvControl.Onoff();
		mSharpTvControl.nextChannel();
		mSharpTvControl.setChannel(9);
		mSharpTvControl.setChannel(28);
		mSharpTvControl.Back();
		mSharpTvControl.Onoff();
		
	}
}

3. 桥接模式与策略模式的差异

  • 桥接模式的目的是让底层实现和上层接口可以分别演化,从而提高移植性

  • 策略模式的目的是将复杂的算法封装起来,从而便于替换不同的算法

  • 桥接模式是往往是为了利用已有的类或方法
  • 策略模式是为了扩展和修改,并提供动态配置
  • 桥接模式强调接口对象仅仅提供基本操作
  • 策略模式强调接口对象提供的是一种算法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值