一、概述
桥接模式是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变,是一种结构型设计模式。
二、角色
抽象化(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用,Abstraction充当桥接类
修正抽象化(Refined Abstraction):扩展抽象化角色,改变和修正父类对抽象化的定义
实现化(Implementor):这个角色给出实现化角色的接口,但不给出具体的实现,必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,者两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作
具体实现化(Concrete Implementor):这个角色给出实现化角色接口的具体实现
三、桥接模式
1.抽象化
/**
* 抽象化角色类,它声明了一个方法operation(),并给出了它的实现,这个实现是通过
* 向实现化对象的委派(调用operationImpl()方法)实现的
*/
public abstract class Abstraction {
protected Implementor impl;
public Abstraction(Implementor impl) {
this.impl = impl;
}
public void operation() {
impl.operationImpl();
}
}
2.修正抽象化
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor impl) {
super(impl);
}
// 其他的操作方法
public void otherOperation() {
}
}
3.实现化
public abstract class Implementor {
/**
* 示例方法,实现抽象部分需要的某些具体功能
*/
public abstract void operationImpl();
}
4.具体实现化
public class ConcreteImplementorA extends Implementor {
@Override
public void operationImpl() {
// 具体操作
}
}
public class ConcreteImplementorB extends Implementor {
@Override
public void operationImpl() {
// 具体操作
}
}
四、使用
1.品牌类型
// 品牌
public interface Brand {
void info();
}
class Lenovo implements Brand {
@Override
public void info() {
System.out.print("Lenovo ");
}
}
class Apple implements Brand {
@Override
public void info() {
System.out.print("Apple ");
}
}
2.电脑类型
// 抽象的电脑类型
public abstract class Computer {
protected Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
public void info() {
brand.info();
}
}
class Desktop extends Computer {
public Desktop(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.print("Desktop ");
}
}
class Laptop extends Computer {
public Laptop(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.print("Laptop ");
}
}
3.测试
@Test
public void testBridge() {
Computer c1 = new Desktop(new Apple());
c1.info();
Computer c2 = new Laptop(new Lenovo());
c2.info();
}