设计模式-桥接模式(六)

桥接模式 也称 桥梁模式

  • 用意:

抽象化实现化 脱耦,使得二者可以独立地变化
一个软件系统中抽象化与实现化之间使用组合/聚合的关系,而非继承的关系,从而使两者可以独立的变化

一般地,一个抽象对应多个实现,也就是一个接口有多个实现类,这样要换不同的实现的时候就很方便了,


image.png

但是当抽象也是变化点的时候该怎么办呢?

image.png

如果用继承的方法,我们可以想象一下,这会导致更多的类出来,条理不清晰,并且抽象或者实现要增加一个的时候,原来的类需要修改.
这时,我们要找出哪一个变化点是静态的关系用继承,哪一个是动态的关系,用聚合

image.png

  • 实例代码:
Bridge.png

上图考虑的是下面这个场景,对于一个文字的显示Text,有粗体和斜体,同时对于不同的操作系统不同的粗体和斜体实现也不一样.

  1. 先定义一个实现的接口
package com.byedbl.bridge;

/**
 *  The Implementor
 */
public interface TextImp  {
    void drawTextImp();
}
  1. 分不同的系统有不同的实现
package com.byedbl.bridge;

/**
 *  The ConcreteImplementor
 */
public class TextImpLinux implements TextImp {
    public TextImpLinux() {
    }
    public void drawTextImp() {
        System.out.println("The text has a Linux style !");
    }
}
package com.byedbl.bridge;

/**
 *  The ConcreteImplementor
 */
public class TextImpMac implements TextImp {
    public TextImpMac() {
    }
    public void drawTextImp() {
        System.out.println("The text has a Mac style !");
    }
}
  1. 再定义一个我们需要的Text,将刚刚定义的接口聚合到这个抽象里面
package com.byedbl.bridge;

/**
 *  The Abstract of Text 
 */
public abstract class Text  {
    public abstract void drawText(String text);
    protected TextImp getTextImp(String type) {
        if(type.equals("Mac")) {
            return new TextImpMac();
        } else if(type.equals("Linux")) {
            return new TextImpLinux();
        } else {
            return new TextImpMac();
        }
    }
}
  1. 对于Text文本,本身它自己也分粗体和斜体等不同实现
package com.byedbl.bridge;

/**
 * The RefinedAbstraction
 */
public class TextBold extends Text {
    private TextImp imp;

    public TextBold(String type) {
        imp = getTextImp(type);
    }

    public void drawText(String text) {
        System.out.println(text);
        System.out.println("The text is bold text!");
        imp.drawTextImp();
    }
}
package com.byedbl.bridge;

/**
 *  The RefinedAbstraction
 */
public class TextItalic extends Text {
    private TextImp imp;
    public TextItalic(String type) {
        imp = getTextImp(type);
    }
    public void drawText(String text) {
        System.out.println(text);
        System.out.println("The text is italic text!");
        imp.drawTextImp();
    }
}
  1. 客户端调用
package com.byedbl.bridge;

/**
 *  
 *  A test client
 *  抽象工厂可以为桥梁模式提供产品创建的结构
 *  就是在Text类中的 getTextImp 方法可以用抽象工厂来实现
 *  形如: getTextImp(TextFactory factory) , TextFactory 就是客户端传入的抽象工厂
 *  这样,如果要加一种Text,那就只要添加一个TextXXX,
 *  如果要多支持一个操作系统也只要添加一个 TextImpWindows,和创建这个 TextImpWindows 的工厂
 *
 */
public class Test  {
    public Test() {
    }

    public static void main(String[] args) {
        Text myText = new TextBold("Mac");
        myText.drawText("=== A test String ===");

        myText =  new TextBold("Linux");
        myText.drawText("=== A test String ===");

        System.out.println("------------------------------------------");
        
        myText =  new TextItalic("Mac");
        myText.drawText("=== A test String ===");

        myText =  new TextItalic("Linux");
        myText.drawText("=== A test String ===");
    }
}

桥接模式解决 当抽象类和实现类都要变化时的问题

你可能感兴趣的:(设计模式-桥接模式(六))