zoukankan      html  css  js  c++  java
  • 6 结构型模式之

    桥接模式的介绍:桥接模式,也称为桥梁模式,是结构型设计模式之一,在现实tgitk大家都知道“桥梁”是连接河道两岸的主要交通枢纽,简而言之其作用就是连接河的两边,而我们的桥梁模式与现实中的情况很是相似,也是承担着连接两边的作用。

    桥接模式的定义:将抽象部分与实现部分分离,使它们都可以独立地进行变化 

    格拉模式的使用场景:从模式的定义中我们大致可以了解到,这里“桥梁”的作用其实就是连接“抽象部分”与“实现部分”,但是事实上,任何多维度变化类或者说多个树状类之间的耦合都可以使用桥接模式来实现解耦。

    如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,可以通过桥接模式使它们在抽象层建立一个关联关系。

    对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,也可以考虑使用桥接模式。

    一个类存在两个独立变化的维度,且这两个维度都需要进行扩展

    下面以生活中的画画为例:我们画画的时候,尺寸方面:有大,中,小三个尺寸的画笔,颜色方面:有红色,蓝色,绿色。

    画画这件事来说,就可以用大号的红色的笔画,也可以用小号的绿色的笔来画,变化很灵活,一个类存在两个变化维度,即尺寸和颜色的变化。

    而且尺寸和颜色都可以进行扩展的。这时候我们就需要把尺寸和颜色抽象出来。

    首先我们先建一个抽象出颜色,代码如下:

     1 /**
     2  * 颜色的抽象
     3  */
     4 public abstract class Color {
     5     protected String color;
     6 
     7     public String getColor(){
     8         return color;
     9     }
    10 
    11 }

    下面分别是三种颜色:红色,蓝色,绿色

    1 /**
    2  * 红色
    3  */
    4 public class RedColor extends Color{
    5 
    6     public RedColor() {
    7         this.color = "红色";
    8     }
    9 }
    1 /**
    2  * 绿色
    3  */
    4 public class GreenColor extends Color{
    5 
    6     public GreenColor() {
    7         this.color = "绿色";
    8     }
    9 }
    1 /**
    2  * 蓝色
    3  */
    4 public class BlueColor extends Color{
    5 
    6     public BlueColor() {
    7         this.color = "蓝色";
    8     }
    9 }

    其次我们也需要也把笔的给抽象出来:

     1 /**
     2  * 笔的抽象
     3  */
     4 public abstract class Pen {
     5     //保存另一个变化的维度
     6     protected Color color;
     7 
     8     public abstract void draw();
     9 
    10     public void setColor(Color color){
    11         this.color = color;
    12     }
    13 
    14 }

    下面是三种不同尺寸的笔:大号,中号,小号

     1 /**
     2  * 大号的笔
     3  */
     4 public class BigPen extends Pen{
     5     @Override
     6     public void draw() {
     7         System.out.println("大号的 "+color.getColor()+" 画笔画画");
     8     }
     9 
    10 }
    1 /**
    2  * 中号的笔
    3  */
    4 public class MiddlePen extends Pen{
    5     @Override
    6     public void draw() {
    7         System.out.println("中号的 "+color.getColor()+" 画笔画画");
    8     }
    9 }
    1 /**
    2  * 小号的笔
    3  */
    4 public class SmallPen extends Pen {
    5     @Override
    6     public void draw() {
    7         System.out.println("小号的 " + color.getColor() + " 画笔画画");
    8     }
    9 }

    下面是客户端测试类:

     1 /**
     2  *
     3  * 桥接模式关键是把抽象与行为实现相分离,动态结合。
     4  */
     5 public class BridgeTest {
     6 
     7     public static void main(String[] args){
     8         test();
     9     }
    10 
    11     public static void test(){
    12 
    13         Pen pen = new BigPen();
    14 
    15         //红色的大号的笔
    16         pen.setColor(new RedColor());
    17         pen.draw();
    18 
    19         //绿色的大号的笔
    20         pen.setColor(new GreenColor());
    21         pen.draw();
    22 
    23         //蓝色的大号的笔
    24         pen.setColor(new BlueColor());
    25         pen.draw();
    26 
    27         //蓝色的小号的笔
    28         pen = new SmallPen();
    29         pen.setColor(new BlueColor());
    30         pen.draw();
    31     }
    32 }

    运行结果如下:

    大号的 红色 画笔画画
    大号的 绿色 画笔画画
    大号的 蓝色 画笔画画
    小号的 蓝色 画笔画画

    Process finished with exit code 0

    通过上面的桥接模式,我们可以很好的实现扩展,达到对修改关闭,对扩展开放

  • 相关阅读:
    Oracle的锁表与解锁
    plsql查询数据显示为乱码解决方法
    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
    javascript基础总结
    通过百度echarts实现数据图表展示功能
    表单中Readonly和Disabled的区别
    mybatis中的#和$的区别
    java持久层框架mybatis如何防止sql注入
    故事讲解:我是一个线程
    Python菜鸟之路:Django 中间件
  • 原文地址:https://www.cnblogs.com/start1225/p/6798780.html
Copyright © 2011-2022 走看看