本文实例讲述了Java使用桥接模式实现开关和电灯照明功能。分享给大家供大家参考,具体如下:

一、模式定义

桥接模式,也称桥梁模式,在软件系统中,由于自身的逻辑,具有两个或多个维度的变化,如何应对这种多维度的变化,桥接模式使得软件系统能够轻松地沿着多个方向进行变化,而又不引入额外的复杂度。

桥接模式三个关键词为:抽象化,实现化,脱耦

二、模式举例

1 桥接模式分析方法

我们借用电灯照明来说明该模式。

不使用继承,使用对象组合的方式,将开关和电灯的强关联关系变成弱关联关系。

2 桥接模式静态类模型

3 代码示例

3.1 创建电灯接口

package com.demo.bridge.lights;

/**

* 电灯接口

*

* @author

*

*/

public interface ILight

{

// 接通电流

public void electricConnected();

// 照明

public void light();

// 电流关闭

public void electricClosed();

}

3.2 创建一般开关

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();

}

}

3.3 创建遥控开关

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();

}

}

3.4 白炽灯实现

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("白炽灯照明!");

}

}

3.5 水晶灯实现

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("水晶灯照明!");

}

}

3.6 一般开关控制白炽灯,遥控开关控制水晶灯

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);

}

}

运行结果:

-- 一般开关 --

白炽灯被打开了...

白炽灯照明!

白炽灯被关闭了...

-- 遥控开关 --

水晶灯被打开了...

水晶灯照明!

...现在是暖色!

水晶灯被关闭了...

3.7 一般开关控制水晶灯,遥控开关控制白炽灯

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(crystalLight);

switch1.makeLight();

System.out.println("\n-- 遥控开关 -- ");

// 遥控开关

RemoteControlSwitch remoteControlSwitch = new RemoteControlSwitch(

incandescentLight);

remoteControlSwitch.makeRemoteLight(1);

}

}

运行结果

-- 一般开关 --

水晶灯被打开了...

水晶灯照明!

水晶灯被关闭了...

-- 遥控开关 --

白炽灯被打开了...

白炽灯照明!

...现在是暖色!

白炽灯被关闭了...

三、设计原则

1 尽量使用对象聚合弱关联,避免使用继承强关联。

2 抽象化和实现化脱耦。

四、使用场合

1 不希望在抽象类和实现部分之间有一个固定的绑定关系

2 类的抽象及实现部分都应该可以通过孑类的方法加以扩充

3 对一个抽象的实现部分的修改对客户不产生影响,即客户代码不必重新编译

五、桥接模式静态类图

希望本文所述对大家java程序设计有所帮助。

java控制灯_Java使用桥接模式实现开关和电灯照明功能详解相关推荐

  1. java 正则表达式 电话_Java读取文件及基于正则表达式的获取电话号码功能详解...

    本文实例讲述了Java读取文件及基于正则表达式的获取电话号码功能.分享给大家供大家参考,具体如下: 1.正则表达式 正则表达式,又称 正规表示法 . 常规表示法 (英语:Regular Express ...

  2. java 重启线程_java 可重启线程及线程池类的设计(详解)

    了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...

  3. java常量配置_java项目动态配置常量和peiconfig.properties配置使用详解

    java项目动态配置常量和peiconfig.properties配置使用详解 点击:2 Java工程中配置信息一般都写在 properties文件中,下面这篇文章是对java基础配置的一点学习心得整 ...

  4. java char 打印_Java中char[]输出不是内存地址的原因详解

    前言 Java中共有八种基本数据类型:byte,int,short,long,float,double,char,boolean. 计算机中的基础数据单位是bit, 1byte=8bit. 数据类型 ...

  5. java 查找注解_Java利用反射如何查找使用指定注解的类详解

    前言 最近有些空,想自己写个跟spring里的注解一样的注解来用,然后希望能找到使用了自己写了注解的类,下面来介绍一下实现方法 声明,下面代码是没看过spring源码写的,基本上都是网上找的博客,整理 ...

  6. java 内存分布_java的各类型数据在内存中分配情况详解_

    1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Jav ...

  7. java 全角_java全角、半角字符的关系以及转换详解

    如果搞明白了Java中全角字符和半角字符之间的关系 那他们之间的转换根本就不是个事. 全角字符与半角字符的关系 可以通过下面的程序看看Java中所有字符以及对应编码的值 public static v ...

  8. java 8 新功能详解_Java 8的8个新功能

    java 8 新功能详解 注意:确保还检查了我们的详细教程Java 8 Features – ULTIMATE Guide . Jdk 1.8(又名Java 8)今天发布,这意味着它的通用发布版本已经 ...

  9. java 8 新功能详解_Java 8和Java 14之间的新功能

    java 8 新功能详解 从版本9开始,Java每6个月就有一次新功能,因此很难跟踪这些新更改. 互联网上的大多数信息都描述了最近2个Java版本之间的变化. 但是,如果您的情况与我相似,则说明您使用 ...

最新文章

  1. 基于matlab fdma传输系统设计,基于MATLAB的LTE系统仿真研究
  2. 交替性注意力_如何从心理学角度解释“专注力”,“专注力”对一个人的影响?...
  3. 2021热度不减的在线教育,正在努力成为线下教育的有益补充
  4. [js高手之路] vue系列教程 - vue的事件绑定与方法(2)
  5. 如何在shell单元建立washer_如何成为一个优秀的工程师
  6. GitHub上的OpenJDK
  7. 财务报表五力、五性分析雷达图
  8. 原创 leetcode[454]四数相加II /4Sum II 哈希策略
  9. 漫画:寻找无序数组的第k大元素
  10. tampermonkey这玩意如何替换flash播放器为h5播放器?
  11. 系统架构改进--多系统用户整合
  12. 连接mysql失败怎么办_数据库连接失败有什么原因?怎么解决?
  13. Arduino Uno + PAJ7620U2 实现手势识别控制LED灯工作
  14. eplan p8详细安装步骤文库_EPLAN P8 2.1.6 安装指南
  15. 电容笔和Apple pencil区别有什么?双十一值得入手的电容笔推荐
  16. 基于浙大MO平台的开发机器学习算法
  17. airbnb房东_麻烦找房东侵入式监视筛查方法可能是罪魁祸首
  18. golang时间字符串和时间戳转换
  19. 从专业角度说说修仙游戏应该怎么做
  20. 系统规划与管理师笔记——信息系统综合知识

热门文章

  1. 想申请高新技术企业吗?送你一份最新申报攻略!
  2. 项目学习记录(四)--基于图像检测的AR语文识字应用
  3. python自制电子记事本_利用Python制作一个“电子记事本”
  4. lighttpd+fastcgi嵌入式web交叉编译到arm
  5. 易语言5.6官方版下载地址
  6. FATAL ERROR: please install the following Perl modules before executing ...: Data::Dumper
  7. 怎样备份计算机注册表文件格式,小技巧:教你自动备份注册表!
  8. 怎么把emlog文章做成html,EMLOG调用文章图片代码
  9. php与单片机通信,通过单片机的无线通信软件实现编解码的解决方
  10. LISP 圆孔标记_在AUTOCAD中如何用lisp语言新建一个标注样式