目录
上述代码 GitHub 地址:https://github.com/baicun/designPatterns
桥接模式:
将接口实现与抽象放在俩个不同的类层次中,是俩个层次可以独立改变,而互相补充。
桥接优点:
增强了可拓展性,可以在两个维度自由拓展。
桥接模式应用:
暂无
桥接模式和策略模式的区别
桥接的目的是让接口实现和抽象层可以分别演化,从而提高移植性;
策略的目的是将复杂的算法封装起来,从而便于替换不同的算法。
桥接模式往往是为了利用已有的方法或类;
策略模式是为了扩展和修改,并提供动态配置。
桥接模式强调接口对象仅提供基本操作,而抽象实现中进行接口功能组装;
策略模式强调接口对象提供的是一种算法。
桥接实例:
类图:
示例:
遥控器项目:一个遥控器加工厂代工各品牌遥控器,遥控器底层接口有开、关、设置音量、设置频道,所有的遥控器都要实现这个接口,而客户直观看到的遥控器只有简单的三个按钮,开/关、上一个频道、下一个频道,我们也需要写不同品牌的遥控器实现方法。俩个相对独立的类层次,我们使用桥接模式,即使未来需求变更,遥控器底层接口变更或是遥控器端增删功能,只需要改变任意实现类就好。
代码:
底层遥控器接口:
/**
* @Description : 遥控器接口
*/
public interface Control {
//开
public void On();
//关
public void Off();
//设置频道
public void setChannel(int ch);
//设置音量
public void setVolume(int vol);
}
索尼底层遥控器实现类:
/**
* @Description : 底层索尼遥控器
*/
public class SonyControl implements Control {
@Override
public void On() {
System.out.println("*Open Sony TV*");
}
@Override
public void Off() {
System.out.println("*Off Sony TV*");
}
@Override
public void setChannel(int ch) {
System.out.println("*The Sony TV Channel is setted "+ch+"*");
}
@Override
public void setVolume(int vol) {
System.out.println("*The Sony TV Volume is setted "+vol+"*");
}
}
夏普底层遥控器实现类:
/**
* @Description : 底层夏普遥控器
*/
public class SharpControl implements Control {
@Override
public void On() {
System.out.println("***Open Sharp TV***");
}
@Override
public void Off() {
System.out.println("***Off Sharp TV***");
}
@Override
public void setChannel(int ch) {
System.out.println("***The Sharp TV Channel is setted "+ch+"***");
}
@Override
public void setVolume(int vol) {
System.out.println("***The Sharp TV Volume is setted "+vol+"***");
}
}
遥控器抽象类:
public abstract class TvAbstractControlabs {
Control mControl=null;
public TvAbstractControlabs(Control mControl)
{
this.mControl=mControl;
}
//开/关
public abstract void Onoff();
//下一个频道
public abstract void nextChannel();
//上一个频道
public abstract void preChannel();
}
索尼遥控器:
public class SonyTvControl extends TvAbstractControlabs {
private int ch=0;
private boolean ison=false;
public SonyTvControl(Control mControl)
{
super(mControl);
}
@Override
public void Onoff() {
if(ison)
{
ison=false;
mControl.Off();
}else{
ison=true;
mControl.On();
}
}
@Override
public void nextChannel() {
ch++;
mControl.setChannel(ch);
}
@Override
public void preChannel() {
ch--;
if(ch<0)
{
ch=200;
}
mControl.setChannel(ch);
}
}
夏普遥控器:
public class SharpTvControl extends TvAbstractControlabs {
private int ch=0;
private boolean ison=false;
private int prech=0;
public SharpTvControl(Control mControl) {
super(mControl);
}
@Override
public void Onoff() {
if(ison)
{
ison=false;
mControl.Off();
}else{
ison=true;
mControl.On();
}
}
@Override
public void nextChannel() {
prech=ch;
ch++;
mControl.setChannel(ch);
}
@Override
public void preChannel() {
prech=ch;
ch--;
if(ch<0)
{
ch=200;
}
mControl.setChannel(ch);
}
public void setChannel(int nch)
{
prech=ch;
ch=nch;
mControl.setChannel(ch);
}
public void Back()
{
mControl.setChannel(prech);
}
}
测试类:
public class MainTest {
public static void main(String[] args) {
SonyTvControl mSonyTvControl;
mSonyTvControl=new SonyTvControl(new SonyControl());
mSonyTvControl.Onoff();
mSonyTvControl.preChannel();
mSonyTvControl.preChannel();
mSonyTvControl.preChannel();
mSonyTvControl.Onoff();
SharpTvControl mSharpTvControl;
mSharpTvControl=new SharpTvControl(new SharpControl());
mSharpTvControl.Onoff();
mSharpTvControl.nextChannel();
mSharpTvControl.setChannel(9);
mSharpTvControl.setChannel(28);
mSharpTvControl.Back();
mSharpTvControl.Onoff();
}
}