向Bridge模式招手

Bridge的精髓就是书上常说的“ 把抽象和实现解耦,使得它们可以独立地变化
1.开关,风扇与电灯:
在实际生活中,我们利用开关(各式各样的开关)来操纵电灯(电器之类)。那么问题来了,如果电灯坏了,我们仅仅只要更换灯泡这个对象,而开关无需一起更换。这映射出面向对象的愿望:各司其职,开关和电器之间借由电线这个桥梁履行着各自的职责,并互不干扰。这就是著名的Bridge模式。
ToggleSwitch并不是指专用于打开电灯的开关,可以想象为上下波动型开关。RotarySwitch 可想象为旋钮型开关。

ElectricalEquipment's ClassDiagram

2.蜡笔,毛笔的选择:
如果要完成一幅巨作,有大片的蓝色天空,线条轮廓清晰的房屋。选择蜡笔,先买了一盒12色的小口径蜡笔,天空画了一半,我血都吐出来了,什么鬼,这小小支的蜡笔要涂到什么时候,于是我又买来了12色大口径的蜡笔,这样我一挥一来,天空就好了,内心欢喜。然后我又想买12色的中口径、12色另些口径,,,慢慢的,蜡笔填满了我的钱包,我追求的世界和平呢?终于我开始思考,诶,我用毛笔吧。说真,买三种型号(大,中,小)毛笔,再买来12色的水彩原料,我的世界也就光明起来,真是很天才的想法。
这是我关于Bridge最爱的例子,将面向对象诠释的生动。你看:
1.蜡笔由于不能将大小与颜色解耦,所以不及毛笔的灵活性。就是对抽象和耦合的最精彩概述。
2.毛笔将型号、颜色归类,不就是封装的精髓。
3.那句“各司其职,职责单一”,在毛笔与水彩原料的设计上,简直凶残的体现。

Bridge's ClassDiagram

下面就是一堆代码的实现了,理解思想,编码就任游星空了。
public interface Equipment{
    void powerOn();
    void powerOff();
}

public class LightEquipment implements Equipment{
    @override
    public void powerOn(){
        System.out.println("Light ON");
    }
    @override
    public void powerOff(){
        System.out.println("Light OFF");
    }
}

public class FanEquipment implements Equipment{
    @override
    public void powerOn(){
        System.out.println("Fan ON");
    }
    @override
    public void powerOff(){
        System.out.println("Fan OFF");
    }
}
  public class Switch{
      private Equipment equipment;
      ...
      //equipment的setter,getter方法
      
      public void on(){
          //开启开关的操作
          System.out.println("Switch ON");
          equipment.powerOn();
      }
      public void off(){
          //关闭开关的操作
          System.out.println("Switch OFF");
          equipment.powerOff();
      }
  }
 
 public class RotarySwitch extends Switch{    
 }

 public class ToggleSwitch extends Switch{
 }
    public void static main(String[] args){
        Switch toggleSwitch= new ToggleSwitch();    //拨动型开关
        Switch rotarySwitch= new RotarySwitch();    //旋钮型开关

        toggleSwitch.setEquipment(new Light());     //电灯使用拨动型开关
        toggleSwitch.on();
        toggleSwitch.off();

        //fan...
    }

正如上面例子所示:
若电灯使用不再使用拨动开关,而换成旋钮开关,则只需做如下变化,将各对象解耦:

rotarySwitch.setEquipment(new Light());    //电灯使用旋钮型开关

以上类图使用ProcessOn所绘,www.processon.com

划破距离长空,识得人间。
近安
ooooor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值