设计模式之桥接模式

在实际生活中,某些类具有两个或多个维度的变化,如汽车既可以按品牌分,又可以按照功率划分。如何设计出不同品牌和不同功率的汽车?如果使用继承的方式去实现,则会有m种品牌和n种功率的汽车,一共有m*n种组合,这样不仅对应的子类众多,而且不容易扩展。但是,如果用桥接模式就能很好地解决这些问题。

一、桥接模式的定义

桥接(Bridge)模式是将抽象与其具体实现分离,使它们可以各自独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。桥接模式采用封装、聚合以及继承将责任分配到不同的类中。

二、桥接模式的结构

2.1 桥接模式包含的主要角色

  1. 抽象化角色(Abstraction):定义抽象类,并包含一个对实现化对象的引用。
  2. 扩展抽象化角色(Refined Abstraction):是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. 实现化角色(Implementor):定义实现化角色的接口,供扩展抽象化角色调用。
  4. 具体实现化角色(Concrete Implementor):给出实现化角色接口的具体实现。

2.2 桥接模式的结构图

桥接模式的结构图

三、桥接模式的优缺点

3.1 优点:

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

3.2 缺点:

  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
  • 桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景

四、桥接模式的实现

public class BridgeTest {
    public static void main(String[] args) {
        Implementor imple = new ConcreteImplementor();
        Abstraction abs = new RefinedAbstraction(imple);
        abs.Operation();
    }
}
//实现化角色
public interface Implementor {
    public void OperationImpl();
}
//具体实现化角色
public class ConcreteImplementor implements Implementor {
    public void OperationImpl() {
        System.out.println("具体实现化(Concrete Implementor)角色被访问");
    }
}
//抽象化角色
public abstract class Abstraction {
    protected Implementor imple;
    protected Abstraction(Implementor imple) {
        this.imple = imple;
    }
    public abstract void Operation();
}
//扩展抽象化角色
public class RefinedAbstraction extends Abstraction {
    protected RefinedAbstraction(Implementor imple) {
        super(imple);
    }
    public void Operation() {
        System.out.println("扩展抽象化(Refined Abstraction)角色被访问");
        imple.OperationImpl();
    }
}

五、实例展示

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值