桥接模式
定义:
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式
场景:
每个电视牌子都有一次遥控器,用户需要改变遥控器的功能,下面看看桥接模式是怎么实现的。
实现:
遥控器的实现:
/// <summary> /// 遥控器,这里面扮演抽象化角色 /// </summary> public class RemoteControl { private TV t; public TV tv { get { return t; } set { t = value; } } public virtual void On() { t.On(); } public virtual void Off() { t.Off(); } public virtual void tunchange() { t.tuneChannel(); } } public class concreteRemote : RemoteControl { public override void tunchange() { base.tunchange(); } } /// <summary> /// 电视机的抽象方法 /// </summary> public abstract class TV { //打开 public abstract void On(); //关闭 public abstract void Off(); //换频道 public abstract void tuneChannel(); }
电视机的实现:
/// <summary> /// 电视机的抽象方法 /// </summary> public abstract class TV { //打开 public abstract void On(); //关闭 public abstract void Off(); //换频道 public abstract void tuneChannel(); } /// <summary> /// 长虹电视 /// </summary> public class ChangHong : TV { public override void Off() { Console.WriteLine("长虹电视机已经关闭了"); } public override void On() { Console.WriteLine("长虹电视机已经打开了"); } public override void tuneChannel() { Console.WriteLine("长虹电视机开始在切换频道"); } } /// <summary> /// 三星电视 /// </summary> public class SamSung : TV { public override void Off() { Console.WriteLine("三星电视机已经关闭了"); } public override void On() { Console.WriteLine("三星电视机已经打开了"); } public override void tuneChannel() { Console.WriteLine("三星电视机开始在切换频道"); } }
实现:
static void Main(string[] args) { RemoteControl remoteControl = new concreteRemote(); // 长虹电视机 remoteControl.tv = new ChangHong(); remoteControl.On(); remoteControl.tunchange(); remoteControl.Off(); Console.WriteLine(); // 三星牌电视机 remoteControl.tv = new SamSung(); remoteControl.On(); remoteControl.tunchange(); remoteControl.Off(); Console.Read(); }
优点:
把抽象接口与其实现解耦。
抽象和实现可以独立扩展,不会影响到对方。
实现细节对客户透明,对用于隐藏了具体实现细节。
缺点:
增加了系统的复杂度
使用场景:
- 如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系。
- 设计要求实现化角色的任何改变不应当影响客户端,或者实现化角色的改变对客户端是完全透明的。
- 需要跨越多个平台的图形和窗口系统上。
- 一个类存在两个独立变化的维度,且两个维度都需要进行扩展。
心得:
感觉所有的设计模式都是把那些容易变化的,或者共有的,提供到一个接口或者抽象类,然后子类再去继承和实现,提高类的复用性,是我学的迷糊了,还是搞混淆了?