加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

桥接模式 策略模式与桥接模式区别

发布时间:2020-12-14 04:45:23 所属栏目:百科 来源:网络整理
导读:设计模式文章 中介者模式 代理模式 抽象工厂模式详解 —— head first 设计模式 装饰者模式 适配器模式 策略模式 观察者模式 建造者模式 (Builder) 概述 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 P

设计模式文章

中介者模式

代理模式

抽象工厂模式详解 —— head first 设计模式

装饰者模式

适配器模式

策略模式

观察者模式

建造者模式 (Builder)

概述

在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。

当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。

桥接模式的定义与特点

桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

桥接(Bridge)模式的优点是:

  • 由于抽象与实现分离,所以扩展能力强;

  • 其实现细节对客户透明。

缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。

桥接模式的结构与实现

主要解决:在多维可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

结构

可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。

桥接(Bridge)模式包含以下主要角色。

  • 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。

  • 扩展抽象化(Refined? Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。

  • 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。

  • 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

?

模式示例

?1、定义实现类接口(Implementor)

public interface Implementor {

    void operationImpl();
}

?2、定义具体实现类(ConcreteImplementor)A和B

class ConcreteImplementorA implements Implementor{
 
    @Override
     operationImpl() {
        System.out.println("类型A");
    }
}

class ConcreteImplementorB  operationImpl() {
        System.out.println("类型B");
    }
}

?3、定义抽象类(Abstraction)

abstract class Abstraction {
 
    public Implementor implementor;
    
     setImplementor(Implementor implementor) {
        this.implementor = implementor;
    }
 
     operation();
}

?4、定义扩充抽象类(Refined Abstraction)

class RefinedAbstraction extends Abstraction{
 
    @Override
     operation() {
        implementor.operationImpl();
    }
}

?5、测试代码如下:

 TestMain {
 
    static  main(String[] args) {
        Abstraction a = new RefinedAbstraction();
        a.setImplementor( ConcreteImplementorA());
        a.operation();
    }
}

示例分析

我们都去买过手机,手机按照品牌分可以分为华为、小米、oppo、vivo 等品牌,如果这些手机按照内存分又可以分为 4G、6G、8G 等等。假如我们每一种手机都想要玩一下,至少需要 4*3 个。这对我们来说这些手机也太多了,竟然有 12 个,最主要的是手机品牌和内存是放在一起的。现在有这样一种机制,手机牌品商是一个公司,做手机内存的是一个公司,想要做什么手机我们只需要让其两者搭配起来即可。有点类似于全球贸易分工明确的思想,这就是桥接模式,把两个不同维度的东西桥接起来。

1、定义实现类接口(Implementor),这里定义手机内存接口:

/*Implementor:定义手机内存接口*/
 Memory {
     addMemory();
}

2、定义具体实现类(ConcreteImplementor),这里指具体的内存,内存这里定义了两种一种是 6G,一种是 8G

ConcreteImplementor:具体实现类1class Memory6G  Memory{
    @Override
     addMemory() {
        System.out.println("手机装了6G内存"ConcreteImplementor:具体实现类2class Memory8G  addMemory() {
        System.out.println("手机装了8G内存");
    }
}

3、定义抽象类(Abstraction),这里指手机

Abstraction:手机抽象类 Phone {
 
     Memory memory;
    
     set(Memory memory) {
        this.memory = memory;
    }
     buyPhone();
}

4、定义扩充抽象类(Refined Abstraction),这里指具体的手机品牌,以华为和小米为例

class HuaWei  Phone{
 
     buyPhone() {
        memory.addMemory();
        System.out.println("购买华为手机"class XiaoMi  buyPhone() {
        memory.addMemory();
        System.out.println("购买小米手机");
    }
}

5、测试代码如下:

 main(String[] args) {
        //让华为搭配8G内存
        Phone huawei =  HuaWei();
        huawei.set( Memory8G());
        huawei.buyPhone();
        
        让小米搭配6G内存
        Phone xiaomi =  XiaoMi();
        xiaomi.set( Memory6G());
        xiaomi.buyPhone();
    }
}

? 6、输出结果如下:

从代码就可以看出,购买手机的时候,品牌和内存两个维度是分开的,这样后续品牌和内存之间是可以独立变化,而不会影响到另一个类。

桥接模式与策略模式的区别

桥接模式如下:

策略如下:

在桥接中,Abstraction 通过聚合方式引用 Implementor.

在策略中,Context 也通过聚合引用 Strategy.

桥接 (Bridge) 模式是结构型模式的一种,而策略 (strategy) 模式则属于行为模式。

从他们的结构图可知,在这两种模式中,都存在一个对象使用聚合的方式引用另一个对象的抽象接口的情况,而且该抽象接口的实现可以有多种并且可以替换。可以说两者在表象上都是调用者与被调用者之间的解耦,以及抽象接口与实现的分离。

那么两者的区别体现在什么地方呢?

  1. 首先,在形式上,两者还是有一定区别的,对比两幅结构图,我们可以发现,在桥接模式中不仅 Implementor 具有变化(ConcreateImplementior),而且 Abstraction 也可以发生变化(RefinedAbstraction),而且两者的变化是完全独立的,RefinedAbstraction 与 ConcreateImplementior 之间松散耦合,它们仅仅通过 Abstraction 与? Implementor 之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性。

  2. 其次在语意上,桥接模式强调 Implementor 接口仅提供基本操作,而 Abstraction 则基于这些基本操作定义更高层次的操作。而策略模式强调 Strategy 抽象接口的提供的是一种算法,一般是无状态、无数据的,而 Context 则简单调用这些算法完成其操作。

  3. 桥接模式中不仅定义 Implementor 的接口而且定义 Abstraction 的接口,Abstraction 的接口不仅仅是为了与 Implementor 通信而存在的,这也反映了结构型模式的特点:通过继承、聚合的方式组合类和对象以形成更大的结构。在策略模式中,Startegy 和 Context 的接口都是两者之间的协作接口,并不涉及到其它的功能接口,所以它是行为模式的一种。行为模式的主要特点就是处理的是对象之间的通信方式,往往是通过引入中介者对象将通信双方解耦,在这里实际上就是将 Context 与实际的算法提供者解耦。

所以相对策略模式,桥接模式要表达的内容要更多,结构也更加复杂。桥接模式表达的主要意义其实是接口隔离的原则,即把本质上并不内聚的两种体系区别开来,使得它们可以松散的组合,而策略在解耦上还仅仅是某一个算法的层次,没有到体系这一层次。从结构图中可以看到,策略的结构是包容在桥接结构中的,桥接中必然存在着策略模式,Abstraction 与 Implementor 之间就可以认为是策略模式,但是桥接模式一般 Implementor 将提供一系列的成体系的操作,而且 Implementor 是具有状态和数据的静态结构。而且桥接模式 Abstraction 也可以独立变化。

?

参考文章

策略模式与桥接模式区别

桥接模式

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读