7、Bridge(桥接模式)
2019-05-20 本文已影响0人
我要扭开奥利奥
目的
将抽象部分和他的实现相分离,是他们都可以独立的变化。
使用场景
- 不希望在抽象类和他的实现部分之间有一个固定的绑定关系。
- 类的抽象和他的视线都想要能够通过生成子列的方式加以扩充的时候。
- 对于一个抽象的实现部分的修改不会对于外部的客户产生影响。
- 对与调用者隐藏抽象部分。
具体使用
假设我们是一个遥控器生产厂商,遥控器可以控制电视机。对于每一个遥控器控制器厂商来说,要是不能生产一个通用遥控器没那么就要为每一个电视重新配置一遍,那么就会很麻烦。
为了解决这个问题,我们就需要使用bridge这一个模式来减少开发的工作量。
首先我们建立一个接口,所有的电视生产公司都遵循这个接口来控制电视。
package bridge;
/**
* 控制接口,所有的电视
* 都需要实现这个接口里面的功能
*/
public interface Control {
void On();
void Off();
}
下面是每一个电视厂商自己为自己的的遥控方式做的定义,虽然接口一样,但是他们的每一的实现方法都不一样。
package bridge;
/**
* LG电视机为自己的电视规定的遥控方式
*/
public class LGControl implements Control{
@Override
public void On(){
System.out.println("LG on");
}
@Override
public void Off(){
System.out.println("LG off");
}
}
package bridge;
/**
* Sony为自己的电视规定的遥控方式
*/
public class SonyControl implements Control{
@Override
public void On(){
System.out.println("Sony on");
}
@Override
public void Off(){
System.out.println("Sony off");
}
}
下面就是开始为我们的遥控器厂商进行配置。
首先我们设置一个抽象类,在这个类里面我们定义控制方式。
package bridge;
/**
* 遥控器厂商实现的抽象类
*/
public abstract class TVControlabs {
Control tControl = null;
public TVControlabs(Control control){
this.tControl = control;
}
public abstract void OnOff();
}
这个类按照电视厂商的规定方式来控制电视,所实现的方式是使用了tControl
这个对象来实现控制的。
package bridge;
public class TVControl extends TVControlabs {
private boolean isOn = false;
public TVControl(Control control){
super(control);
}
@Override
public void OnOff(){
if(isOn){
isOn = false;
tControl.Off();
}else{
isOn = true;
tControl.On();
}
}
}
最后是我们的测试类
package bridge;
public class Client {
public static void main(String[] args){
TVControl mLGContol;
TVControl mSonyControl;
mLGContol = new TVControl(new LGControl());
mLGContol.OnOff();
mLGContol.OnOff();
mSonyControl = new TVControl(new SonyControl());
mSonyControl.OnOff();
mSonyControl.OnOff();
}
}