zoukankan      html  css  js  c++  java
  • 设计模式--桥接模式

    桥接模式也称为桥梁模式、接口模式或者柄体模式,是将抽象部分与它的具体实现部分分离,使它们都可以独立地变化,属于结构型模式。

    桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多继承的方式,但是多重继承方案往往违背了类的单一职责原则,其复用性比较差,桥接模式是比多重继承更好的替代方案。桥接模式的核心在于解耦抽象和实现。

    桥接模式UML类图:

    抽象(Abstraction):该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);

    修正抽象(RefinedAbstraction):Abstraction的具体实现,对Abstraction的方法进行完善和扩展;

    实现(Implementor):确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或抽象类;

    具体实现(ConcreteImplementor):Implementor的具体实现。

    桥接模式的通用写法:

    创建抽象角色Abstraction类:

    public abstract class Abstraction {
    
        protected Implementor implementor;
    
        public Abstraction(Implementor implementor){
            this.implementor = implementor;
        }
    
        public void operation(){
            this.implementor.operationImpl();
        }
    }
    

    创建修正抽象角色RefinedAbstraction类:

    public class RefinedAbstraction extends Abstraction{
    
        public RefinedAbstraction(Implementor implementor){
            super(implementor);
        }
    
        @Override
        public void operation() {
            super.operation();
            System.out.println("refined operation");
        }
    }
    

    创建实现角色Implementor类:

    public interface Implementor {
        void operationImpl();
    }
    

    创建具体实现ConcreteImplementorA类:

    public class ConcreteImplementorA implements Implementor{
    
        @Override
        public void operationImpl() {
            System.out.println("I'm ConcreteImplementor A");
        }
    }
    

    桥接模式的应用场景:

    当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。桥接模式适用于以下几种业务场景:

    1、在抽象和具体实现之间需要增加更多的灵活性的场景;

    2、一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。

    3、不希望使用继承,或因为多层继承导致系统类的个数剧增。

    设计模式有一个原则:优先使用组合/聚合的方式,而不是继承。

    桥接模式在源码中的应用:

    JDBC API,其中有一个Driver类就是桥接对象。这里以mysql为例。

    类图:

    桥接模式的优缺点:

    桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。

    优点:

    1、分离抽象部分及具体实现部分

    2、提高了系统的扩展性

    3、符合开闭原则

    4、符合合成复用原则

    缺点:

    1、增加了系统的理解与设计难度

    2、需要正确的识别系统中两个独立变化的维度

  • 相关阅读:
    pyinstaller相关用法
    yield 与 yield from
    async /await相关知识理解
    调试程序方法pdb
    任务22-4
    任务22-2
    跳台阶
    计算三维空间某点距离原点的欧式距离
    质数判断
    罗马数字转换
  • 原文地址:https://www.cnblogs.com/snail-gao/p/14743342.html
Copyright © 2011-2022 走看看