设计模式-桥接模式
桥接模式(Bridge Pattern),对应英文名称可以是Bridge或者Bradge任意一种都可以。
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
假设现在我现在要引入HP这个产品,而HP下不但和PC和Server还有Printer,
如果按抽象工厂模式中那篇文章的方式来划分,首先在PC类别和Server类别中加入HP,然后再增加一个Printer类,下面包括三个品牌
PC包括(Dell、IBM、HP)
Server包括(Dell、IBM、HP)
Printer包括(Dell、IBM、HP)
看可以看到代码量是成指数方式增长,看来此方案不可取。
现在我们加入一个品牌类来管理,比如Brand(Dell,IBM,HP),然后Dell(PC、Server、Printer),其它的以此类推,我们先来看下UML模型图
或者各种产品加入一个设备类来管理,比如Machine(PC、Server、Printer),然后PC(Dell、IBM、HP),其它的以此类推,我们来看下UML模型图
我们看到现在这个继承关系变得更加复杂,那么姑且先不说程序代码数量的增加,后期如果再引入新的元素时,程序将会变得难以维护。
下面我们将使用另一种方式来划分,先看下按此方式划分的UML模型图
通过UML模型图我们可以到在Bran和Mahine之间建立起了一座桥梁,这主是本篇文章开头提到的桥接模式。
设计模式CARP原则告诉我们类与类之间尽量使用合成/聚合关系,少用继承关系,以便更大程度的降低类与类之间的偶合关系。
品牌Brand(Dell、IBM、HP)
设备Machine(PC、Server、Printer)
下面我们来看下具体实现代码
品牌基类
abstract class Brand
{
private string name;
public Brand(string name)
{
this.name = name;
}
public virtual string Name { get { return name; } set { name = value; } }
public abstract void Describe();
protected Machine machine;//添加对Machine的引用或者说关联
public void SetMachine(Machine machine)//操作设备: pc,server,printer...
{
this.machine = machine;
}
public abstract void On();
public abstract void Off();
}
具休品牌
class Dell : Brand
{
public Dell(string name) : base(name)
{
}
public override void Describe()
{
System.Console.WriteLine("I am {0} brand", Name);
}
public override void On()
{
machine.On();
}
public override void Off()
{
machine.Off();
}
}
class IBM : Brand
{
public IBM(string name) : base(name)
{
}
public override void Describe()
{
System.Console.WriteLine("I am {0}", Name);
}
public override void On()
{
machine.On();
}
public override void Off()
{
machine.Off();
}
}
class HP : Brand
{
public HP(string name) : base(name)
{
}
public override void Describe()
{
System.Console.WriteLine("HP: I am {0}", Name);
}
public override void On()
{
machine.On();
}
public override void Off()
{
machine.Off();
}
}
设备接口类,包含二个方法
interface Machine
{
void On();//启动
void Off();//关闭
}
class PC : Machine
{
public void On()
{
Console.WriteLine("PC power on");
}
public void Off()
{
Console.WriteLine("PC power off");
}
}
class Server : Machine
{
public void On()
{
Console.WriteLine("Server power on");
}
public void Off()
{
Console.WriteLine("Server Power off");
}
}
class Printer : Machine
{
public void On()
{
Console.WriteLine("Printer power on");
}
public void Off()
{
Console.WriteLine("Printer power off");
}
}
调用代码
<span style="white-space:pre"> </span> Console.WriteLine("Bradge Pattern \n");
Brand dell = new Dell("Dell"); //创建Dell品牌
Machine dellpc = new PC(); //创建电脑
dell.SetMachine(dellpc); //将使用Dell电脑
dell.Name = "dell d311 pc"; //设置产品名称
dell.Describe();
dell.On();
dell.Off();
Console.WriteLine();
Brand ibm = new IBM("IBM"); //创建IBM品牌
Machine ibmpc = new PC(); //创建电脑
ibm.SetMachine(ibmpc); //将使用IBM电脑
ibm.Name = "ibm r60e pc"; //设置产品名称
ibm.Describe();
ibm.On();
ibm.Off();
Machine ibmserver = new Server(); //创建服务器
ibm.SetMachine(ibmserver); //将使用IBM服务器
ibm.Name = "ibm x860 server"; //设置产品名称
ibm.Describe();
ibm.On();
ibm.Off();
Console.WriteLine();
Brand hp = new HP("HP"); //创建HP品牌
Machine hppc = new PC(); //创建电脑
hp.SetMachine(hppc); //将使用HP电脑
hp.Name = "hp h70 pc"; //设置产品名称
hp.Describe();
hp.On();
hp.Off();
Machine hpprinter = new Printer(); //创建打印机
hp.SetMachine(hpprinter); //将使用HP打印机
hp.Name = "hp laserjet2100 printer";//设置产品名称
hp.Describe();
hp.On();
hp.Off();
Console.WriteLine();
代码输出
Bradge Pattern
Simple Bradge
I am dell d311 pc
PC power on
PC power off
I am ibm r60e pc
PC power on
PC power off
I am ibm x860 server
Server power on
Server Power off
HP: I am hp h70 pc
PC power on
PC power off
HP: I am hp laserjet2100 printer
Printer power on
Printer power off
请按任意键继续. . .
版权所有,转载请注明文章出处 http://blog/csdn.net/cadenzasolo