桥接模式是一种结构型设计模式,可将 一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。
假如你有一个几何形状类,从它能扩展除两个子类:圆形和方形。你希望对这样的类层次结构进行扩展以使其包含颜色,所以要创建名为红色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());
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_44932487/article/details/116884953
内容来源于网络,如有侵权,请联系作者删除!