• 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

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

  • 相关阅读:
    设计模式的原则
    List是线程安全的吗?如果不是该怎么办呢?安全的List对性能的影响有多大呢?
    StringBuilder是不是线程安全的?
    并行运算和普通运算之性能比较
    分布式与集群的区别
    sql查询性能分析
    C#代码实现,确保windows程序只有一个实例(instance)
    jQuery UI
    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo
    整理的一些学习网站资料
  • 原文地址:https://www.cnblogs.com/start1225/p/6798780.html
Copyright © 2020-2023  润新知