基本概念
桥接模式的动机:
- 由于实际的需要,某个类具有两个或两个以上的维度变化,如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿。
桥接模式的作用:
- 桥接模式的做法是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后,提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。
桥接模式的角色:
Implementor,实现类接口。
ConcreteImplementor,具体实现类。
Abstraction,抽象类。
RefinedAbstraction,扩充抽象类。
实例探究
电视和遥控器就是一个典型例子。电视机和遥控器一样都有多种种类,所以将它们中任何一个定义为一个具体类都不是好办法。所以要采用两层抽象。
Implementor,实现类接口。
public interface ITV { void turnOn(); void turnOff(); void changeChanel(int channel); }
ConcreteImplementor,具体实现类。
public class SonyTV implements ITV { @Override public void turnOn() { System.out.println("Sony is turned on."); } @Override public void turnOff() { System.out.println("Sony is turned on."); } @Override public void changeChanel(int channel) { System.out.println("Sony is changed chanel- " + channel); } }
Abstraction,抽象类。
public abstract class RemoteControl implements ITV { public ITV tv; public RemoteControl(ITV tv) { this.tv = tv; } @Override public void turnOn() { tv.turnOn(); } @Override public void turnOff() { tv.turnOff(); } @Override public void changeChanel(int channel) { tv.changeChanel(channel); } }
ConcreteImplementor,扩充抽象类。
public class LogitechRemoteControl extends RemoteControl { public LogitechRemoteControl(ITV tv) { super(tv); } public void setChannelKeyboard(int channel) { tv.changeChanel(channel); System.out.println("Logitech use keyword to set channel."); } }
具体调用如下:
ITV tv = new SonyTV(); LogitechRemoteControl lrc = new LogitechRemoteControl(tv); lrc.setChannelKeyboard(100);