Java设计模式 - 桥接模式

目录

桥接模式:

桥接优点:

桥接模式应用:

桥接模式和策略模式的区别

桥接实例:

类图:

示例:

代码:

上述代码 GitHub 地址:https://github.com/baicun/designPatterns


桥接模式:

将接口实现与抽象放在俩个不同的类层次中,是俩个层次可以独立改变,而互相补充。

桥接优点:

增强了可拓展性,可以在两个维度自由拓展。

桥接模式应用:

暂无

桥接模式和策略模式的区别

桥接的目的是让接口实现和抽象层可以分别演化,从而提高移植性;

策略的目的是将复杂的算法封装起来,从而便于替换不同的算法。

桥接模式往往是为了利用已有的方法或类;

策略模式是为了扩展和修改,并提供动态配置。

桥接模式强调接口对象仅提供基本操作,而抽象实现中进行接口功能组装;

策略模式强调接口对象提供的是一种算法。

桥接实例:

类图:

Java设计模式 - 桥接模式_第1张图片

示例:

遥控器项目:一个遥控器加工厂代工各品牌遥控器,遥控器底层接口有开、关、设置音量、设置频道,所有的遥控器都要实现这个接口,而客户直观看到的遥控器只有简单的三个按钮,开/关、上一个频道、下一个频道,我们也需要写不同品牌的遥控器实现方法。俩个相对独立的类层次,我们使用桥接模式,即使未来需求变更,遥控器底层接口变更或是遥控器端增删功能,只需要改变任意实现类就好。

代码:

底层遥控器接口:

/**
 * @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();
		
	}
}

 

上述代码 GitHub 地址:https://github.com/baicun/designPatterns

你可能感兴趣的:(碎片时间学习,java,23种设计模式,Java基础,java设计模式,Java设计模式,-,桥接模式,桥接模式)