zoukankan      html  css  js  c++  java
  • 桥接模式-挣钱的设计模式。

    前言:

    写了N多年代码,知道设计模式已经有8,9年了,用过设计模式,有一些又很好的用处。但是也有一些是不应该存在的设计模式。

    从这里开始: 

    桥接模式

    1.作用:

    将一个抽象与实现解耦,以便两者可以独立的变化。(摘自wiki

    2.UML

    3.代码:

    /** "Implementor" */
    interface DrawingAPI
    {
        public void drawCircle(double x, double y, double radius);
    }
     
    /** "ConcreteImplementor" 1/2 */
    class DrawingAPI1 implements DrawingAPI
    {
       public void drawCircle(double x, double y, double radius) 
       {
            System.out.printf("API1.circle at %f:%f radius %f
    ", x, y, radius);
       }
    }
     
    /** "ConcreteImplementor" 2/2 */
    class DrawingAPI2 implements DrawingAPI
    {
       public void drawCircle(double x, double y, double radius) 
       { 
            System.out.printf("API2.circle at %f:%f radius %f
    ", x, y, radius);
       }
    }
     
    /** "Abstraction" */
    interface Shape
    {
       public void draw();                                            // low-level
       public void resizeByPercentage(double pct);     // high-level
    }
     
    /** "Refined Abstraction" */
    class CircleShape implements Shape
    {
       private double x, y, radius;
       private DrawingAPI drawingAPI;
       public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI)
       {
           this.x = x;  this.y = y;  this.radius = radius; 
           this.drawingAPI = drawingAPI;
       }
     
       // low-level i.e. Implementation specific
       public void draw()
       {
            drawingAPI.drawCircle(x, y, radius);
       }   
       // high-level i.e. Abstraction specific
       public void resizeByPercentage(double pct)
       {
            radius *= pct;
       }
    }
     
    /** "Client" */
    class BridgePattern {
       public static void main(String[] args)
       {
           Shape[] shapes = new Shape[2];
           shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1());
           shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2());
     
           for (Shape shape : shapes)
           {
               shape.resizeByPercentage(2.5);
               shape.draw();
           }
       }
    }

    4.评论:

    这个模式是为了模式而模式,有一个问题:

    如果代码写成这个样子,会有一门课叫做《重构》等待着你,这就是挣钱的原因。都让计算机专家赚走了。

    Shape已经有了完全的抽象,DrawAPI有存在的必要马?No。看不到任何的用处?写在了Draw方法中和写在DrawAPI中没有任何区别。

    实际上类似而真正有用的例子是输出到外设上:比如绘制到屏幕、压感笔上。但是这里的基本原理是:屏幕和压感笔实现了一套相同的绘画API。

    Shape的Draw使用了绘制API,输出到真正的设备上。

    这才是真正有意义的地方。wait?我为什么觉得我们在这里:偏题了。只有对抽象的扩充,已形成新的实现。没有出现和作用所言的,二者独立变化!!!

    将一个抽象与实现解耦,以便两者可以独立的变化??抽象没有一丝一毫的变化,只有现实在变化。抽象没有丝毫的变化。一旦出现这种情况。抽象进行了变化,以为着什么。抽象进行了扩充,增强了功能。但是实现依然是抽象的实现。

    (这不是外观模式吗?那么桥接模式在那里?)

    一旦抽象和实现解耦,意味这他们拥有着不同的含义。这个时候,进行重构吧。

  • 相关阅读:
    在chrome插件开发中,如何executeScript多个content script文件
    [Silverlight]MVVM+MEF框架Jounce练习(1)
    EF的日期运算
    【silverlight】Silverlight TreeViw默认展开节点
    singleton pattern简单随笔
    Design pattern形象比喻
    C#简单选择排序
    回文算法
    C#插入排序
    Jquery调用存储过程实例
  • 原文地址:https://www.cnblogs.com/tom-zhao/p/4418243.html
Copyright © 2011-2022 走看看