zoukankan      html  css  js  c++  java
  • 桥接模式(Bridge Pattern)

    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("
    -- 遥控开关 -- ");
            // 遥控开关
            RemoteControlSwitch remoteControlSwitch = new RemoteControlSwitch(
                    crystalLight);
            remoteControlSwitch.makeRemoteLight(1);
        }
    }

    运行结果:

    image

  • 相关阅读:
    haproxy 2.5 发布
    cube.js sql 支持简单说明
    基于graalvm 开发一个cube.js jdbc driver 的思路
    apache kyuubi Frontend 支持mysql 协议
    oceanbase 资源池删除说明
    基于obd 的oceanbase 扩容说明
    jfilter一个方便的spring rest 响应过滤扩展
    cube.js schema 定义多datasource 说明
    typescript 编写自定义定义文件
    meow 辅助开发cli 应用的工具
  • 原文地址:https://www.cnblogs.com/mshwu/p/3405261.html
Copyright © 2011-2022 走看看