惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
小众软件
小众软件
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
T
Threat Research - Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
Hacker News: Ask HN
Hacker News: Ask HN
Application and Cybersecurity Blog
Application and Cybersecurity Blog
I
Intezer
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
B
Blog
The Last Watchdog
The Last Watchdog
The Cloudflare Blog
U
Unit 42
Last Week in AI
Last Week in AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tor Project blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Tailwind CSS Blog
Project Zero
Project Zero
P
Palo Alto Networks Blog
V
Vulnerabilities – Threatpost
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
C
Cisco Blogs
G
Google Developers Blog
A
About on SuperTechFans
博客园 - Franky
博客园 - 聂微东
Help Net Security
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
Recent Commits to openclaw:main
Recent Commits to openclaw:main
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
Docker
N
Netflix TechBlog - Medium
V2EX - 技术
V2EX - 技术
Cyberwarzone
Cyberwarzone
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
PCI Perspectives
PCI Perspectives
W
WeLiveSecurity
Engineering at Meta
Engineering at Meta
C
Check Point Blog
量子位

博客园 - mshwu

单例模式 工厂方法模式 命名空间的规划 Download Manager Intent(二) Intent (一) Fragment (一) 2-1 Managing the Activity Lifecycle java1.5新特性(转) 1-4 Starting Another Activity 1-3 Building a Simple User Interface(创建简单的用户界面) 1-2 Android系统架构基本模式解析 1-1 Building Your First Android Application FTP Send File: Source Code Review(转) 动态操作文件 通用日志管理工具 触发器程序 通过CLP实现library之间的自动复制 (转) OVRDBF的用法
桥接模式(Bridge Pattern)
mshwu · 2013-11-03 · via 博客园 - mshwu

1,定义

          桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂度,

桥接模式是连接功能与实现部分的设计模式,其用意在于使功能与实现分离,从而支持多维度的变化。

现实抽象理解:

开关与电灯,开关通过电线连接电灯,进而控制电灯,在这里,电灯可以认为是实现部分,而开关代表功能部分,我们可以独立的更换开关或电灯两者之一,而对另一方没有任何影响, 也就是说每个部分的变化(更换)对另一部分不会造成影响。

2,模式分析

  • 将抽象与实现解耦,从而使两者可以相对独立的变化而互不影响;
  • 使用聚合关联,不使用继承关联;
  • 应对多维度的变化需求;
  • 在两种层次间扮演彼此沟通的桥梁,把不同层次区分开来,使两个层次在分别在各之的方向扩展。

3, 使用场合

  • 不希望在抽象类和它的实现部分之间有一个固定的绑定关系;
  • 类的抽象及实现都应该可以通过生成子类的方法加以扩充;
  • 对一个抽象的部分的更改应该对客户端没有任何影响,即客户的代码不必重新编译。

以电灯及开关为例,开关可控制不同的电灯

image

从上面静态类国可以看出,由实现部分,功能部分及桥梁共同实现桥接模式

实现部分与功能部分可以各自在自己的类层次上扩展,而对其它部分没有任何影响,我们可以通过实现ILight接品添加新的电灯,同样可以通过继承BaseSwitch实现新的开关,所以,实现部分与功能部分可以实现各自的扩展,模式支持多维度的变化

把电灯实例注入开关中,实现功能与实现部分的桥梁作用。

电灯接口:

package com.demo.bridge.lights;

/**
 * 电灯接口
 * 
 * @author
 * 
 */
public interface ILight
{
    // 接通电流
    public void electricConnected();

    // 照明
    public void light();

    // 电流关闭
    public void electricClosed();

}

一般开关:

通过此处把电灯实例注入进来,充当功能部分与实现部分的沟通桥梁的作用,调用实现部分实现真正的开灯动作

package com.demo.bridge.switchs;

import com.demo.bridge.lights.ILight;

/**
 * 开关顶层类
 * 
 * @author
 * 
 */
public class BaseSwitch {
    // 使用组合 设置ILight为内部私有属性 此为桥梁
    protected ILight light;

    // 构造方法将 外部的light类型注入进来
    public BaseSwitch(ILight light) {
        this.light = light;
    }

    /**
     * 开灯方法
     */
    public final void makeLight() {
        // 打开开关 接通电流
        this.light.electricConnected();
        // 照明
        this.light.light();
        // 关闭开关 关闭电流
        this.light.electricClosed();
    }
}

摇控开关:

调用实现部分实现真正的开灯动作,只是在功能上添加颜色,由此可见,我们可以通过添加新的功能类实现新的功能,而对实现部分没有任何影响。

package com.demo.bridge.switchs.sub;

import com.demo.bridge.lights.ILight;
import com.demo.bridge.switchs.BaseSwitch;

/**
 * 遥控开关 继承BaseSwitch 扩展功能
 * 
 * @author
 * 
 */
public class RemoteControlSwitch extends BaseSwitch
{
    // 构造方法
    public RemoteControlSwitch(ILight light)
    {
        super(light);
    }

    /**
     * 使用遥控开关控制开灯
     * 
     * @param operColor
     *            灯颜色
     */
    public final void makeRemoteLight(int operColor)
    {
        // 打开开关 接通电流
        this.light.electricConnected();
        // 照明
        this.light.light();
        String color = "";
        switch (operColor)
        {
            case 1:
                color = "暖色";
                break;
            case 2:
                color = "蓝色";
                break;
            case 3:
                color = "红色";
                break;
            default:
                color = "白色";
                break;
        }
        System.out.println(" ...现在是" + color + "!");

        // 关闭开关 关闭电流
        this.light.electricClosed();
    }
}

白炽灯实现:

package com.demo.bridge.lights.impl;

import com.demo.bridge.lights.ILight;

/**
 * 白炽灯 实现
 * 
 * @author
 * 
 */
public class IncandescentLight implements ILight
{
    // 电流关闭
    public void electricClosed()
    {
        System.out.println("白炽灯被关闭了...");

    }

    // 接通电流
    public void electricConnected()
    {
        System.out.println("白炽灯被打开了...");
    }

    // 照明
    public void light()
    {
        System.out.println("白炽灯照明!");

    }

}

水晶灯实现:

package com.demo.bridge.lights.impl;

import com.demo.bridge.lights.ILight;

/**
 * 水晶灯 实现
 * 
 * @author
 * 
 */
public class CrystalLight implements ILight
{
    // 电流关闭
    public void electricClosed()
    {
        System.out.println("水晶灯被关闭了...");

    }

    // 接通电流
    public void electricConnected()
    {
        System.out.println("水晶灯被打开了...");

    }

    // 照明
    public void light()
    {
        System.out.println("水晶灯照明!");

    }

}

客户程序:

我们也可以让一般开发控制水晶灯,只需把水晶灯实例注入到一般开关中

package com.demo;

import com.demo.bridge.lights.ILight;
import com.demo.bridge.lights.impl.CrystalLight;
import com.demo.bridge.lights.impl.IncandescentLight;
import com.demo.bridge.switchs.BaseSwitch;
import com.demo.bridge.switchs.sub.RemoteControlSwitch;

/**
 * 客户端应用程序
 * 
 * @author
 * 
 */
public class ClientForBridge {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // 白炽灯 实例
        ILight incandescentLight = new IncandescentLight();
        // 水晶灯 实例
        ILight crystalLight = new CrystalLight();

        // 一般开关
        System.out.println("-- 一般开关 -- ");
        BaseSwitch switch1 = new BaseSwitch(incandescentLight);
        switch1.makeLight();
        System.out.println("\n-- 遥控开关 -- ");
        // 遥控开关
        RemoteControlSwitch remoteControlSwitch = new RemoteControlSwitch(
                crystalLight);
        remoteControlSwitch.makeRemoteLight(1);
    }
}

运行结果:

image