- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
桥接模式是一种结构型设计模式,可将 一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。
假如你有一个几何形状类,从它能扩展除两个子类:圆形和方形。你希望对这样的类层次结构进行扩展以使其包含颜色,所以要创建名为红色Red和蓝色的形状子类。但是,由于你已有两个子类,所有总共序要创建四个类才能覆盖所有组合,例如蓝色圆形和红色方形。
问题的根本原因使我们试图在两个独立的维度——形状和颜色——上扩展形状类。这在处理类继承时是很常见的问题。
桥接模式通过将继承改为组合的方式来解决这个问题。具体来说,就是抽取其中一个维度并使之成为独立的类层次,这样就可以在初始类中 引用这个新层次的对象,从而使得一个类不必拥有所有的状态和行为。
类的代码行数越多, 弄清其运作方式就越困难, 对其进行修改所花费的时间就越长。 一个功能上的变化可能需要在整个类范围内进行修改, 而且常常会产生错误, 甚至还会有一些严重的副作用。
桥接模式可以将庞杂类拆分为几个类层次结构。 此后, 你可以修改任意一个类层次结构而不会影响到其他类层次结构。 这种方法可以简化代码的维护工作, 并将修改已有代码的风险降到最低。
桥接建议将每个维度抽取为独立的类层次。 初始类将相关工作委派给属于对应类层次的对象, 无需自己完成所有工作。
/**
* 所有设备的通用接口
*/
public interface Device {
boolean isEnabled();
void enable();
void disable();
int getVolume();
void setVolume(int percent);
int getChannel();
void setChannel(int channel);
void printStatus();
}
/**
*收音机类
*/
public class Redio implements Device {
private boolean on=false;
private int volume=30;
private int channel=1;
@Override
public boolean isEnabled(){
return on;
}
@Override
public void enable(){
on=true;
}
@Override
public void disable(){
on=false;
}
@Override
public int getVolume() {
return volume;
}
@Override
public void setVolume(int volume) {
if(volume>100){
this.volume=100;
}else if(volume<0){
this.volume=0;
}else {
this.volume=volume;
}
}
@Override
public int getChannel() {
return channel;
}
@Override
public void setChannel(int channel) {
this.channel=channel;
}
@Override
public void printStatus() {
System.out.println("------------------------------------");
System.out.println("| 我是收音机.");
System.out.println("| I'm " + (on ? "enabled" : "disabled"));
System.out.println("| Current volume is " + volume + "%");
System.out.println("| Current channel is " + channel);
System.out.println("------------------------------------\n");
}
}
public class Tv implements Device{
private boolean on=false;
private int volume=30;
private int channel=1;
@Override
public boolean isEnabled() {
return on;
}
@Override
public void enable() {
on=true;
}
@Override
public void disable() {
on=false;
}
@Override
public int getVolume() {
return volume;
}
@Override
public void setVolume(int volume) {
if(volume>100){
this.volume=100;
}else if(volume<0){
this.volume=0;
}else {
this.volume=volume;
}
}
@Override
public int getChannel() {
return channel;
}
@Override
public void setChannel(int channel) {
this.channel=channel;
}
@Override
public void printStatus() {
System.out.println("------------------------------------");
System.out.println("| 我是电视.");
System.out.println("| I'm " + (on ? "enabled" : "disabled"));
System.out.println("| Current volume is " + volume + "%");
System.out.println("| Current channel is " + channel);
System.out.println("------------------------------------\n");
}
}
/**
* 所有远程控制控制器的通用接口
*/
public interface Remote {
void power();
void volumeDown();
void volumeUp();
void channelDown();
void channelUp();
}
/**
* 基础远程控制器
*/
public class BasicRemote implements Remote{
protected Device device;
public BasicRemote(){}
public BasicRemote(Device device){
this.device=device;
}
@Override
public void power() {
System.out.println("Remote :power toggle");
if(device.isEnabled()){
device.disable();
}else{
device.enable();
}
}
@Override
public void volumeDown() {
System.out.println("remote:volume down");
device.setVolume(device.getVolume()-10);
}
@Override
public void volumeUp() {
System.out.println("Remote:volume up");
device.setVolume(device.getVolume()+10);
}
@Override
public void channelDown() {
System.out.println("Remote:channel down");
device.setVolume(device.getVolume()+10);
}
@Override
public void channelUp() {
System.out.println("Remote :channel up");
}
}
/**
* 高级的远程控制器
*/
public class AdvancedRemote extends BasicRemote{
public AdvancedRemote(Device device){
super.device=device;
}
public void mute(){
System.out.println("Remote:mute");
device.setVolume(0);
}
}
/**
*客户端
*/
public class BridgePatternDemo {
public static void testDevice(Device device){
System.out.println("Test with basic remote.");
BasicRemote basicRemote=new BasicRemote(device);
basicRemote.power();
device.printStatus();
System.out.println("Tests with advanced remote.");
AdvancedRemote advancedRemote = new AdvancedRemote(device);
advancedRemote.power();
advancedRemote.mute();
device.printStatus();
}
public static void main(String[] args){
testDevice(new Tv());
}
}
with advanced remote.");
AdvancedRemote advancedRemote = new AdvancedRemote(device);
advancedRemote.power();
advancedRemote.mute();
device.printStatus();
}
public static void main(String[] args){
testDevice(new Tv());
}
}
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!