zoukankan      html  css  js  c++  java
  • 设计模式-1.10桥接模式

    桥接模式:bridge,将抽象部分与它的实现部分分离,使它们都可以独立的变化。(DP)

    通俗理解:实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

    结构图

    桥接模式的使用场景

                        1、当一个对象有多个变化因素的时候,通过抽象这些变化因素,将依赖具体实现,修改为依赖抽象。

                        2、当某个变化因素在多个对象中共享时。我们可以抽象出这个变化因素,然后实现这些不同的变化因素。

                        3、当我们期望一个对象的多个变化因素可以动态的变化,而且不影响客户的程序的使用时。

    实例一:计算机与操作系统

    书上定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。下面给出这种设计的UML图,其实就是桥接模式的UML图。

     1 //操作系统
     2 class OS
     3 {
     4 public:
     5     virtual void InstallOS_Imp() {}
     6 };
     7 class WindowOS: public OS
     8 {
     9 public:
    10     void InstallOS_Imp() { cout<<"安装Window操作系统"<<endl; } 
    11 };
    12 class LinuxOS: public OS
    13 {
    14 public:
    15     void InstallOS_Imp() { cout<<"安装Linux操作系统"<<endl; } 
    16 };
    17 class UnixOS: public OS
    18 {
    19 public:
    20     void InstallOS_Imp() { cout<<"安装Unix操作系统"<<endl; } 
    21 };
    22 //计算机
    23 class Computer
    24 {
    25 public:
    26     virtual void InstallOS(OS *os) {}
    27 };
    28 class DellComputer: public Computer
    29 {
    30 public:
    31     void InstallOS(OS *os) { os->InstallOS_Imp(); }
    32 };
    33 class AppleComputer: public Computer
    34 {
    35 public:
    36     void InstallOS(OS *os) { os->InstallOS_Imp(); }
    37 };
    38 class HPComputer: public Computer
    39 {
    40 public:
    41     void InstallOS(OS *os) { os->InstallOS_Imp(); }
    42 };

      客户使用方式:

    1 int main()
    2 {
    3     OS *os1 = new WindowOS();
    4     OS *os2 = new LinuxOS();
    5     Computer *computer1 = new AppleComputer();
    6     computer1->InstallOS(os1);
    7     computer1->InstallOS(os2);
    8 }

    实例二:手机品牌与手机软件

     

    补充:

    在面向对象中,合成/聚合复用原则:优先使用对象合成/聚合,而不是类继承。这样有助于你保持每个类被封装,并被剧终在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

    合成(组合、Composition)和聚合(Aggregation)都是关联的特殊种类。

    关联:两个类的一般性关系,例如学生和老师就是一种关联关系。

    聚合:has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,使用空的菱形表示聚合关系。

    组合:contains-a的关系,关联性强于聚合,组合类和被组合类有相同的生命周期,组合类要对被组合类负责,采用实心的菱形标识组合关系。

    链接:

    http://www.cnblogs.com/hegezhou_hot/archive/2010/12/10/1902185.html

    http://blog.csdn.net/wuzhekai1985/article/details/6670473

     

  • 相关阅读:
    CocosIDE导出Android APK的注意事项
    C++14尝鲜:Generic Lambdas(泛型lambda)
    silverlight调用WebService传递json接收绑定数据
    解决考试系统高并发数据载入不对问题
    汇编入门学习笔记 (九)—— call和ret
    Java SerialPort SDK
    how tomcat works 总结 二
    linux下多线程的调试
    垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
    HDU-4973-A simple simulation problem.(线段树)
  • 原文地址:https://www.cnblogs.com/ZhouYong-Travel/p/4126533.html
Copyright © 2011-2022 走看看