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

  • 相关阅读:
    iOS有用的三方库和高效工具记录
    正则表达式
    Exception Type & Exception Code
    信鸽推送(XGPush)
    在vue中使用animate.css
    vue 中父子组件传值:props和$emit
    预编译scss以及scss和less px 转rem
    ES6箭头函数及模版字符串
    移动端页面a input去除点击效果及pc端切换
    vue2搭建简易spa
  • 原文地址:https://www.cnblogs.com/mshwu/p/3405261.html
Copyright © 2011-2022 走看看