java控制灯_Java使用桥接模式实现开关和电灯照明功能详解
本文实例讲述了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使用桥接模式实现开关和电灯照明功能详解相关推荐
- java 正则表达式 电话_Java读取文件及基于正则表达式的获取电话号码功能详解...
本文实例讲述了Java读取文件及基于正则表达式的获取电话号码功能.分享给大家供大家参考,具体如下: 1.正则表达式 正则表达式,又称 正规表示法 . 常规表示法 (英语:Regular Express ...
- java 重启线程_java 可重启线程及线程池类的设计(详解)
了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...
- java常量配置_java项目动态配置常量和peiconfig.properties配置使用详解
java项目动态配置常量和peiconfig.properties配置使用详解 点击:2 Java工程中配置信息一般都写在 properties文件中,下面这篇文章是对java基础配置的一点学习心得整 ...
- java char 打印_Java中char[]输出不是内存地址的原因详解
前言 Java中共有八种基本数据类型:byte,int,short,long,float,double,char,boolean. 计算机中的基础数据单位是bit, 1byte=8bit. 数据类型 ...
- java 查找注解_Java利用反射如何查找使用指定注解的类详解
前言 最近有些空,想自己写个跟spring里的注解一样的注解来用,然后希望能找到使用了自己写了注解的类,下面来介绍一下实现方法 声明,下面代码是没看过spring源码写的,基本上都是网上找的博客,整理 ...
- java 内存分布_java的各类型数据在内存中分配情况详解_
1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Jav ...
- java 全角_java全角、半角字符的关系以及转换详解
如果搞明白了Java中全角字符和半角字符之间的关系 那他们之间的转换根本就不是个事. 全角字符与半角字符的关系 可以通过下面的程序看看Java中所有字符以及对应编码的值 public static v ...
- java 8 新功能详解_Java 8的8个新功能
java 8 新功能详解 注意:确保还检查了我们的详细教程Java 8 Features – ULTIMATE Guide . Jdk 1.8(又名Java 8)今天发布,这意味着它的通用发布版本已经 ...
- java 8 新功能详解_Java 8和Java 14之间的新功能
java 8 新功能详解 从版本9开始,Java每6个月就有一次新功能,因此很难跟踪这些新更改. 互联网上的大多数信息都描述了最近2个Java版本之间的变化. 但是,如果您的情况与我相似,则说明您使用 ...
最新文章
- 基于matlab fdma传输系统设计,基于MATLAB的LTE系统仿真研究
- 交替性注意力_如何从心理学角度解释“专注力”,“专注力”对一个人的影响?...
- 2021热度不减的在线教育,正在努力成为线下教育的有益补充
- [js高手之路] vue系列教程 - vue的事件绑定与方法(2)
- 如何在shell单元建立washer_如何成为一个优秀的工程师
- GitHub上的OpenJDK
- 财务报表五力、五性分析雷达图
- 原创 leetcode[454]四数相加II /4Sum II 哈希策略
- 漫画:寻找无序数组的第k大元素
- tampermonkey这玩意如何替换flash播放器为h5播放器?
- 系统架构改进--多系统用户整合
- 连接mysql失败怎么办_数据库连接失败有什么原因?怎么解决?
- Arduino Uno + PAJ7620U2 实现手势识别控制LED灯工作
- eplan p8详细安装步骤文库_EPLAN P8 2.1.6 安装指南
- 电容笔和Apple pencil区别有什么?双十一值得入手的电容笔推荐
- 基于浙大MO平台的开发机器学习算法
- airbnb房东_麻烦找房东侵入式监视筛查方法可能是罪魁祸首
- golang时间字符串和时间戳转换
- 从专业角度说说修仙游戏应该怎么做
- 系统规划与管理师笔记——信息系统综合知识
热门文章
- 想申请高新技术企业吗?送你一份最新申报攻略!
- 项目学习记录(四)--基于图像检测的AR语文识字应用
- python自制电子记事本_利用Python制作一个“电子记事本”
- lighttpd+fastcgi嵌入式web交叉编译到arm
- 易语言5.6官方版下载地址
- FATAL ERROR: please install the following Perl modules before executing ...: Data::Dumper
- 怎样备份计算机注册表文件格式,小技巧:教你自动备份注册表!
- 怎么把emlog文章做成html,EMLOG调用文章图片代码
- php与单片机通信,通过单片机的无线通信软件实现编解码的解决方
- LISP 圆孔标记_在AUTOCAD中如何用lisp语言新建一个标注样式