zoukankan      html  css  js  c++  java
  • 【设计模式

    1、模式简介

      举个例子,人、车和公路是三个维度,人开着车在公路上行驶,就是将这三个维度进行了关联。人分男人(Man)和女人(Woman),车分小轿车(Car)和公共汽车(Bus),公路分市区公路(Street)和高速公路(Speedway),那么如果我们不使用桥接模式的话,要模拟出所有情况,系统的架构应该是如下图所示的:

     

      从图中可以很容易的看出,这个系统中的类太多了,需要对每种情况都进行考虑,而且如果系统中的维数一多,类中的类就会爆炸。为了解决这个问题,一种解决思路就是使用桥接模式。

    桥接模式定义:

      将抽象部分与实现部分分离,让它们都可以独立的变化。

    桥接模式的适用情况:

      当系统中的维数过多,类的个数随着维数的增多会急剧增加时。

    桥接模式的优点:

    • 实现了抽象和实现的分离;
    • 有很好的扩展能力;
    • 将不同维度放在同一个平面上;
    • 实现细节对用户透明。

    桥接模式的缺点:

      不同维度的关联关系都被放在了抽象层,加大了系统设计的难度。

    上面例子,经过桥接模式处理之后的UML图如下所示:

     

    2、代码

    2.1、需求

      和上面的例子相似,只不过我们换一个例子:

      一个系统中有三个维度,人(Person)包括男人(Man)和女人(Woman);画笔(Drawer)包括铅笔(Pencil)和钢笔(Pen);图形(Shape)包括圆形(Circle)和矩形(Rectangle)。搭建项目框架,使得最终的输出格式如“男人用铅笔画了一个圆形”的格式。

    2.2、分析

      这个项目的UML图如下图所示:

    2.3、代码

      Shape父类中的代码:

    public abstract class Shape {
          abstract void introduce();
    }

      Shape的一个子类Circle类中的代码:

    public class Circle extends Shape {
          @Override
          void introduce() {
               System.out.print("圆形");
          }
    }

      Drawer父类中的代码:

    public abstract class Drawer {
          public Shape shape;
     
          abstract void drawShape();
    }

      Drawer类的一个子类Pencil类中的代码:

    public class Pencil extends Drawer {
          @Override
          void drawShape() {
               System.out.print("用铅笔画了一个");
               super.shape.introduce();
          }
    }

      Person类中的代码:

    public abstract class Person {
          public Drawer drawer;
     
          abstract void draw();
    }

      Person的一个子类Man类中的代码:

    public class Man extends Person {
          @Override
          void draw() {
               System.out.print("男人");
               super.drawer.drawShape();
          }
    }

    2.4、测试

      测试类中的代码:

    public class Test {
          public static void main(String[] args) {
               Shapecircle = new Circle();
     
               Drawerpencil = new Pencil();
               pencil.shape = circle;
     
               Personman = new Man();
               man.drawer = pencil;
     
               man.draw();
               System.out.println();
          }
    }

      测试结果如下图所示:

      最后贴出桥接模式的GitHub代码:【GitHub - Bridge】

  • 相关阅读:
    Kafka API: TopicMetadata
    从事件总线和消息队列说起
    Object.defineproperty实现数据和视图的联动
    css3动画-animation
    css3动画-transition
    jquery判断对象的type
    vs如何在运行iis express调试时,不开打新窗口和关闭调试时,iis express不退出
    重写Equals的方式
    Android中包名不能大写
    C# 几种常见数据结构【转】
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6211106.html
Copyright © 2011-2022 走看看