上面的场景和“简单工厂、工厂方法和抽象工厂模式”那一篇非常相似,不同的地方是电脑多了一种操作系统,软件也相应的多了一种。这里我们可以抽象出另外一种设计模式:桥接模式,即将抽象部分和实现部分分离,使他们可以独立地变化。什么叫“抽象部分和实现部分分离”呢?就假想场景而言,就是让电脑既可以按照操作系统来分类,也可以按照应用软件功能来分类(操作系统是特殊的软件,这里把它单独当作区分电脑的一种分类方式)。更通俗的理解就是“实现系统可能又多种角度分类,每一种分类都可能变化,把这种多角度分离出来让他们独立变化,减少他们之间的耦合”。Code is cheap。看代码了:


using System;
/* 按照软件功能分类 */
/// <summary>
/// 应用程序抽象类
/// </summary>
abstract class Application
{
public abstract void Run();
}
/*office,msn,vs具体类*/
class Office : Application
{
public override void Run()
{
Console.Write("Run Office");
}
}
class Msn : Application
{
public override void Run()
{
Console.Write("Run Msn");
}
}
class VisualStudio : Application
{
public override void Run()
{
Console.Write("Run VS");
}
}
/* 按照操作系统分类 */
abstract class Os
{
protected Application software;
public void SetApplication(Application app)//电脑需要安装应用程序
{
this.software = app;
}
public abstract void Run(); //电脑运行
}
/*windows,linuxs,mac具体类*/
class MsWindows : Os
{
public override void Run()
{
software.Run();
}
}
class HpLinux : Os
{
public override void Run()
{
software.Run();
}
}
class AppleMac : Os
{
public override void Run()
{
software.Run();
}
/// <summary>
/// 客户端调用
/// </summary>
static void Main(string[] args)
{
Os myOs;
myOs = new MsWindows();
myOs.SetApplication(new Office()); //安装office
myOs.Run();
myOs.SetApplication(new Msn()); //安装msn
myOs.Run();
myOs.SetApplication(new VisualStudio()); //安装vs
myOs.Run();
Console.Read();
}
}
合成/聚合复用原则的好处是:”有助于保持每个类被封装,并被集中在单个任务中,这样类和类的继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。“