桥接模式 也称 桥梁模式
- 用意:
将抽象化与实现化 脱耦,使得二者可以独立地变化
一个软件系统中抽象化与实现化之间使用组合/聚合的关系,而非继承的关系,从而使两者可以独立的变化
一般地,一个抽象对应多个实现,也就是一个接口有多个实现类,这样要换不同的实现的时候就很方便了,
image.png
但是当抽象也是变化点的时候该怎么办呢?
image.png如果用继承的方法,我们可以想象一下,这会导致更多的类出来,条理不清晰,并且抽象或者实现要增加一个的时候,原来的类需要修改.
这时,我们要找出哪一个变化点是静态的关系用继承,哪一个是动态的关系,用聚合
-
实例代码:
上图考虑的是下面这个场景,对于一个文字的显示Text,有粗体和斜体,同时对于不同的操作系统不同的粗体和斜体实现也不一样.
- 先定义一个实现的接口
package com.byedbl.bridge;
/**
* The Implementor
*/
public interface TextImp {
void drawTextImp();
}
- 分不同的系统有不同的实现
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 !");
}
}
- 再定义一个我们需要的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();
}
}
}
- 对于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();
}
}
- 客户端调用
package com.byedbl.bridge;
/**
* <pre>
* 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 ===");
}
}
网友评论