• 桥接模式


    桥接模式:将某个问题抽象的不同形式分别与该问题的具体实现部分相分离,使他们都可以独立变化,并能够动态结合

          例如电视厂商海尔,长虹生产21寸,29寸电视机。从这里要将它们分离出来,就用到桥接模式。电视机与电视机生产厂商挂桥,从而,分离出不同厂商的实现,与不同电视机型号的实现.


     

    从上图可以看出,将实际抽象分离出来。

    看下代码


    //生产厂商TelevisionMaker作为Television的成员变量,它也是抽象类,但是它的具体


    实现和Television的实现相分离,并且能和Television动态结合



    //电视机抽象类

    1. public abstract class Television {   
    2.     //电视厂商   
    3.     protected TelevisionMaker televisionMaker;   

    4.     //收看电视   
    5.     abstract public void teleview(TelevisionMaker televisionMaker);   
    6.  

     

    //生产厂商抽象类

    1. public abstract class TelevisionMaker {   
    2.     abstract public void produce();   
    3.  

     

    //电视机的型号,21英寸

    1. public class Inch21 extends Television{   
    2.        
    3.     public void teleview(TelevisionMaker televisionMaker) {   
    4.         System.out.println("21寸电视");   
    5.     }   
    6.   
    7.  

     

    //电视机的型号,29英寸

    1. public class Inch29 extends Television{   
    2.        
    3.     public void teleview(TelevisionMaker televisionMaker) {   
    4.         System.out.println("29寸电视");   
    5.     }   
    6.   
    7.  

     

    //电视机的具体生产厂商,长虹

    public class ChangHong extends TelevisionMaker{   

    1.   
    2.     public ChangHong(){   
    3.         System.out.println("长虹厂商");   
    4.     }   
    5.        
    6.     public void produce() {   
    7.         System.out.println("长虹厂商");   
    8.     }   
    9.  

     

    //电视机的具体生产厂商,海尔

    1. public class Haier extends TelevisionMaker{   
    2.     public Haier(){   
    3.         System.out.println("海尔厂商");   
    4.     }   
    5.        
    6.     public void produce() {   
    7.         System.out.println("海尔厂商");   
    8.     }   
    9.   
    10.  

     

    这样就使用了桥模式,将原本繁杂的系统分离开来。如果根据需求变动,要增加电视机生产型号或者电视机生产厂商,只需要实现相对应的抽象类即可。

    这样,我们也可以根据用户的需要,得到他所需要的电视机,如长虹厂商出厂的29寸电视机。

    测试代码如下:

    1. public class Client {   
    2.   
    3.     public static void main(String[] args) {   
    4.         // TODO Auto-generated method stub   
    5.         Inch29 new Inch29();   
    6.         i.teleview(new ChangHong());   
    7.     }   
    8.  

     结果:

           长虹厂商
           29寸电视




    《设计模式》中对桥接模式的定义为:
    将抽象部分与它的实现部分分离,使他们可以独立地变化。别名为:Handle/Body。
    Bridge模式是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

    结构如下图所示:

    例子代码如下:

    //定义一个事物的抽象,维护对行为实现(Implementor)的引用


    //Shape抽象类
    public abstract class Shape {
    protected Drawing myDrawing;

    abstract public void draw();

    Shape(Drawing drawing) {
        myDrawing = drawing;
    }

    public void drawLine() {
       myDrawing.drawLine();
    }

    public void drawCircle() {
       myDrawing.drawCircle();
    }
    }


    //Circle具体类

    public class Circle extends Shape{
    Circle(Drawing drawing) {
       super(drawing);
    }

    @Override
    public void draw() {
       myDrawing.drawCircle();
    }
    }


    //Rectangle 具体类

    public class Rectangle extends Shape {
    Rectangle(Drawing drawing) {
       super(drawing);
    }

    @Override
    public void draw() {
       myDrawing.drawLine();
       myDrawing.drawLine();
       drawLine();
    }
    }


    //实现部分的抽象,Drawing抽象类
    public abstract class Drawing {
    public abstract void drawLine();
    public abstract void drawCircle();
    }


    //V1Drawing具体类

    public class V1Drawing extends Drawing {
    @Override
    public void drawCircle() {
       DP1.draw_a_circle();
    }

    @Override
    public void drawLine() {
       DP1.draw_a_line();
    }
    }


    //V2Drawing具体类

    public class V2Drawing extends Drawing{
    @Override
    public void drawCircle() {
       DP2.draw_a_circle();
    }

    @Override
    public void drawLine() {
       DP2.draw_a_line();
    }
    }



    public class DP1 {
    public static void draw_a_line() {
       System.out.println("使用DP1的draw_a_line()画线");
    }

    public static void draw_a_circle() {
       System.out.println("使用DP1的draw_a_circle()画圆");
    }
    }

    public class DP2 {
    public static void draw_a_line() {
       System.out.println("使用DP2的draw_a_line()画线");
    }

    public static void draw_a_circle() {
       System.out.println("使用DP2的draw_a_circle()画圆");
    }
    }

    //测试类
    public class BridgeClient {
    public static void main(String args[]) {
       Drawing draw1 = new V1Drawing();
       Drawing draw2 = new V2Drawing();

       Shape shape1 = new Rectangle(draw1);
       shape1.draw();

       Shape shape2 = new Circle(draw2);
       shape2.draw();

       Shape shape3 = new Circle(draw1);
       shape3.draw();
    }
    }

    输出结果:
    使用DP1的draw_a_line()画线
    使用DP1的draw_a_line()画线
    使用DP1的draw_a_line()画线
    使用DP2的draw_a_circle()画圆
    使用DP1的draw_a_circle()画圆



    Bridge模式的优点:
    1 分离接口及其实现部分。
    2 提高可扩充性。
    3 实现细节对客户透明。


  • 相关阅读:
    【转】前端开发工程师如何在2013年里提升自己
    【转】再谈PHP、Python与Ruby
    【转】从知乎上看到“全栈开发者”讨论之后的自黑
    C#精髓 第四讲 GridView 72般绝技
    web网站第一次加载慢的解决方法
    SQL SERVER 提供了一些时间函数:
    Eval() 中数据格式化或格式化数据
    SQL SERVER 取本月上月日期
    LINQ to SQL连接数据库及语句
    权限管理
  • 原文地址:https://www.cnblogs.com/baoendemao/p/3804659.html
Copyright © 2020-2023  润新知