桥接模式 Bridge (结构型)

来源:互联网 发布:c语言中的switch case 编辑:程序博客网 时间:2024/06/14 22:33
一 桥接定义
     [DP]书上定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

二 实例说明
     考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。               
     在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。下面给出这种设计的UML图,其实就是桥接模式的UML图。



传统模式的UML类图

      这样的设计是脆弱的,仔细分析就可以发现,它还是存在很多问题,首先它在遵循开放-封闭原则的同时,违背了类的单一职责原则,即一个类只有一个引起它变化的原因,而这里引起变化的原因却有两个,即路电脑类型变化和操作系统类型的变化;其次是重复代码会很多,不同的操作系统在不同的电脑上运行时也会有一部分的代码是相同的;再次是类的结构过于复杂,继承关系太多,难于维护,最后最致命的一点是扩展性太差。如果变化沿着电脑的类型和不同的操作系统两个方向变化,我们会看到这个类的结构会迅速的变庞大。


三 代码实现

//
//  BridgePattern.h
//  C++Demo
//
//  Created by zhangzhe on 14-3-24.
//  Copyright (c) 2014 Haifeng. All rights reserved.
//

#ifndef C__Demo_BridgePattern_h
#define C__Demo_BridgePattern_h

//操作系统
class OS
{
public:
   
 virtual void InstallOS_Imp() = 0;
};

class WindowOS:public OS
{
public:
   
 void InstallOS_Imp() { cout << "安装Windows操作系统" << endl;}
};

class LinuxOS:public OS
{
public:
   
 void InstallOS_Imp() { cout << "安装LinuxOS操作系统" << endl;}
};

class UnixOS:public OS
{
   
 void InstallOS_Imp() { cout << "安装Unix操作系统" << endl;}
};


//计算机
class Computer
{
public:
   
 virtual void InstallOS(OS* OS) = 0;
};

class DellComputer:public Computer
{
public:
     DellComputer();
    
 void InstallOS(OS *os) { os->InstallOS_Imp(); }
};

DellComputer::DellComputer()
{
}
class AppleComputer:public Computer
{
public:
   
 void InstallOS(OS *os ) { os->InstallOS_Imp(); }
};

class HFComputer:public Computer
{
public:
   
 void InstallOS(OS *os ) { os->InstallOS_Imp(); }
};

#endif

客户使用方式
int main()
{
   OS *os1 = new WindowOS();
   OS *os2 =
 new LinuxOS();
   
   Computer *Computer =
 new AppleComputer(); //MacBook上是可以双系统的
   computer->InstallOS(os1);
   computer->InstallOS(os2);
}

0 0
原创粉丝点击