设计模式之桥接模式(2)

桥接模式(Bridge)

目录

桥接模式(Bridge)

模式动机:

模式结构:

参与者:

例子

模式应用:


模式动机:

桥接模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。

如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。

比如手机品牌和手机游戏种类,手机品牌有多种,游戏也可以有多种。当只抽象手机品牌或者只抽象手机游戏时,遇见需求增加时变化不稳定。故需要针对两个不同的维度提取抽象类和实现类接口,并建立一个抽象关联关系。

模式结构:

参与者:

Abstraction:抽象类

RefinedAbstraction:扩充抽象类

Implementor:实现类接口

ConcreteImplementor:具体实现类

例子

//实现化角色
public interface Implementor {
     //基本方法
     public void doSomething();
     public void doAnything();
}
//具体实现化角色
public class ConcreteImplementor1 implements Implementor{
     public void doSomething(){
             //业务逻辑处理
     }
     public void doAnything(){
             //业务逻辑处理
     }
}
public class ConcreteImplementor2 implements Implementor{
     public void do Something(){
             //业务逻辑处理
}
     public void do Anything(){
             //业务逻辑处理
     }
}
抽象化角色
public abstract class Abstraction {
     //定义对实现化角色的引用
     private Implementor imp;
     //约束子类必须实现该构造函数
     public Abstraction(Implementor _imp){
             this.imp = _imp;
     }
     //自身的行为和属性
     public void request(){
             this.imp.doSomething();
     }
     //获得实现化角色
     public Implementor getImp(){
             return imp;
     }
}

为什么要增加一个构造函数?答案是为了提醒子类,你必须做这项工作,指定实现者,特别是已经明确了实现者,则尽量清晰明确地定义出来。

具体抽象化角色
public class RefinedAbstraction extends Abstraction {
     //覆写构造函数
     public RefinedAbstraction(Implementor _imp){
             super(_imp);
     }
     //修正父类的行为
     @Override
     public void request(){
             /*
              * 业务处理...
              */
             super.request();
             super.getImp().doAnything();
     }
}

测试类

public class Client {
     public static void main(String[] args) {
             //定义一个实现化角色
             Implementor imp = new ConcreteImplementor1();
             //定义一个抽象化角色
             Abstraction abs = new RefinedAbstraction(imp);
             //执行行文
             abs.request();
     }
}

模式应用:

猜你喜欢

转载自blog.csdn.net/qq_36986067/article/details/90183786