乐趣区

关于前端:设计模式之桥接模式

桥接模式是结构型设计模式,桥接模式自身应答的是因为理论的须要,应用不同纬度的条件和办法,桥接模式能够将两个类型分离出来,让两者之间都能够独立的拓展,让每一个类都更加合乎繁多职责。桥接模式与多层继承计划有些不太雷同,它让两个独立变动的设计成为两个独立的继承等级的类,并且在形象简历一个形象关系,该关系相似一条连贯两个继承构造的桥。

桥接模式用了一种奇妙的形式解决多层继承存在的问题,用形象关联取代传统的多层继承关系,将类与动态继承关系转换成动静的对象组合关系,是得零碎更加灵便,易于拓展,同时无效的控制系统类中类的个数。

什么是桥接模式

桥接模式:桥接模式是将形象局部与它的实现局部拆散,使它们都能够独立地变动。它是一种对象结构型模式,又称为柄体 (Handle and Body) 模式或接口 (interface) 模式。——节选自百度百科

桥接模式通过将继承改为组合的形式来解决这个问题。具体来说,就是抽取其中一个维度并使之成为独立的类档次,这样就能够在初始类中援用这个新档次的对象,从而使得一个类不用领有所有的状态和行为。桥接模式次要应答的是因为理论的须要,某个类具备两个或者两个以上的维度变动,如果只是用继承将无奈实现这种须要,或者使得设计变得相当臃肿。

桥接模式优缺点

桥接模式中的形象局部持有具体实现局部的接口,最终目标是通过调用具体实现局部的接口中的办法,进一步实现肯定的性能,这跟间接应用接口没有什么差别,只是表现形式略有不同而已。其次,应用接口的客户程序也能够持有相应的接口对象,这样从模式上就一样了。也就是说,从某个角度来讲,桥接模式是 面向形象编程 这个设计准则的扩大。

正是通过具体实现的接口,把形象局部和具体的实现拆散开来,形象局部相当于是应用实现局部接口的客户程序,这样形象局部和实现局部就涣散耦合了,从而能够实现互相独立的变动。这样一来,简直能够把所有面向形象编写的程序,都视作是桥接模式的体现,至多算是简化的桥接模式,就算是狭义的桥接吧。

长处

  1. 能够创立与平台无关的类和程序
  2. 客户端代码仅与高层形象局部进行互动,不会接触到平台的详细信息
  3. 新增形象局部和实现局部之间不会相互影响
  4. 形象局部专一于解决高层逻辑,实现局部解决平台细节

毛病

对高内聚的类应用桥接模式可能会让代码更加复杂化

示例

桥接模式的次要角色如下:

  1. 形象局部:提供高层管制逻辑,依赖于实现底层理论工作的实现对象
  2. 实现局部:为所有具体实现申明通用接口。形象局部仅能通过在这里申明的办法于实现对象交互
  3. 实现具体:包含特定于平台的代码
  4. 准确形象:提供管制逻辑的变体,与其父类一样,他们通过通用实现接口与不同的实现进行交互
  5. 客户端:仅关怀如何与形象局部单干。然而,客户端须要将形象对象与一个实现对象连接起来

类图如下所示:

代码示例:

// 实现接口角色
interface Implementor {doSomething() : void;
    doAnything() : void;}

// 具体实现角色
class ConcreteImplementor1 implements Implementor {public doSomething() : void { }
    public doAnything() : void {}
}
class ConcreteImplementor2 implements Implementor {public doSomething() : void { }
    public doAnything() : void {}
}

// 抽象类
abstract class Abstraction {
    private imp : Implementor;
    constructor(imp : Implementor) {this.imp = imp;}

    // 本身的行为和属性
    public request() : void {this.imp.doSomething();
    }
}
// 具体抽象化角色
class RefinedAbstraction extends Abstraction {constructor(imp : Implementor) {super(imp);
    }

    public request() : void {
        // 本人写一些解决业务
        super.request();}
}

// 调用
// 定义一个实现化角色
const imp : Implementor = new ConcreteImplementor1();
// 定义一个抽象化角色
const abs : Abstraction = new RefinedAbstraction(imp);
// 执行上下文
abs.request();

总结

如果一个零碎须要在构建的抽象化角色和具体化角色之间减少更多的灵活性,防止在两个档次之间简历动态的继承关系,通过桥接模式能够使他们在形象层建设关系。

抽象化角色和实现化角色能够以继承的形式独立扩大而互不影响,在程序运行时能够动静将一个抽象化子类的对象和一个实现化子类的对象进行组合,即零碎须要对抽象化角色和实现化角色进行动静耦合。

退出移动版