设计模式--桥接模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiao__jia__jia/article/details/86773794

设计模式--桥接模式

桥接模式原理

遥控器项目的设计
极简设计方案
                                 

 

代码:
Control 

public interface Control {
	
	public void On();
	public void Off();
	public void setChannel(int ch);
	public void setVolume(int vol);

}

LGControl  

public class LGControl implements Control {

	@Override
	public void On() {
		// TODO Auto-generated method stub
		System.out.println("**Open LG TV**");
	}

	@Override
	public void Off() {
		// TODO Auto-generated method stub
		System.out.println("**Off LG TV**");
	}

	@Override
	public void setChannel(int ch) {
		// TODO Auto-generated method stub
		System.out.println("**The LG TV Channel is setted "+ch+"**");
	}

	@Override
	public void setVolume(int vol) {
		// TODO Auto-generated method stub
		System.out.println("**The LG TV Volume is setted "+vol+"**");
	}

}


SharpControl 

public class SharpControl implements Control {

	@Override
	public void On() {
		// TODO Auto-generated method stub
		System.out.println("***Open Sharp TV***");
	}

	@Override
	public void Off() {
		// TODO Auto-generated method stub
		System.out.println("***Off Sharp TV***");
	}

	@Override
	public void setChannel(int ch) {
		// TODO Auto-generated method stub
		System.out.println("***The Sharp TV Channel is setted "+ch+"***");
	}

	@Override
	public void setVolume(int vol) {
		// TODO Auto-generated method stub
		System.out.println("***The Sharp TV Volume is setted "+vol+"***");
	}

}


SonyControl 

public class SonyControl implements Control {

	@Override
	public void On() {
		// TODO Auto-generated method stub
		System.out.println("*Open Sony TV*");
	}

	@Override
	public void Off() {
		// TODO Auto-generated method stub
		System.out.println("*Off Sony TV*");
	}

	@Override
	public void setChannel(int ch) {
		// TODO Auto-generated method stub
		System.out.println("*The Sony TV Channel is setted "+ch+"*");
	}

	@Override
	public void setVolume(int vol) {
		// TODO Auto-generated method stub
		System.out.println("*The Sony TV Volume is setted "+vol+"*");
	}

}


TvControl 

public interface TvControl {
	public void Onoff();
	public void  nextChannel();
	public void  preChannel();
}


SonyTvControl 

public class SonyTvControl extends SonyControl implements TvControl{
	private static int ch=0;
	private static boolean ison=false;
	public void Onoff()
	{
		if(ison)
		{
			ison=false;
			super.Off();
		}else{
			ison=true;
			super.On();
		}
	}
	public void nextChannel()
	{
		ch++;
		super.setChannel(ch);
	}
	public void preChannel()
	{
		ch--;
		if(ch<0)
		{
			ch=200;
		}
		super.setChannel(ch);
	}

}


LGTvControl 

public class LGTvControl extends LGControl implements TvControl{
	private static int ch=0;
	private static boolean ison=false;
	public void Onoff()
	{
		if(ison)
		{
			ison=false;
			super.Off();
		}else{
			ison=true;
			super.On();
		}
	}
	public void nextChannel()
	{
		ch++;
		super.setChannel(ch);
	}
	public void preChannel()
	{
		ch--;
		if(ch<0)
		{
			ch=200;
		}
		super.setChannel(ch);
	}

}


MainTest

public class MainTest {
	public static void main(String[] args) {
		LGTvControl mLGTvControl=new LGTvControl();
		SonyTvControl mSonyTvControl=new SonyTvControl();
		
		mLGTvControl.Onoff();
		mLGTvControl.nextChannel();
		mLGTvControl.nextChannel();
		mLGTvControl.preChannel();
		mLGTvControl.Onoff();
		
		mSonyTvControl.Onoff();
		mSonyTvControl.preChannel();
		mSonyTvControl.preChannel();
		mSonyTvControl.preChannel();
		mSonyTvControl.Onoff();
	}


}



新需求带来的设计问题
新需求:电视机厂家,遥控器新设计 
思考问题:变化与不变
                                               

 

桥接模式原理
桥接模式:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变



桥接模式示例代码讲解

示例项目类图结构



TvControlabs 

public abstract class TvControlabs {

	  Control mControl=null;
	public TvControlabs(Control mControl)
	{
		this.mControl=mControl;
	}
	
	public abstract void Onoff();
	public abstract void nextChannel();
	public abstract void preChannel();
	
	
}


TvControl 

public class TvControl extends TvControlabs {
	private  int ch=0;
	private  boolean ison=false;
	
	public TvControl(Control mControl)
	{
		super(mControl);
	}
	@Override
	public void Onoff() {
		// TODO Auto-generated method stub

		if(ison)
		{
			ison=false;
			mControl.Off();
		}else{
			ison=true;
			mControl.On();
		}
	
	}

	@Override
	public void nextChannel() {
		// TODO Auto-generated method stub

		ch++;
		mControl.setChannel(ch);
	
	}

	@Override
	public void preChannel() {
		// TODO Auto-generated method stub

		ch--;
		if(ch<0)
		{
			ch=200;
		}
		mControl.setChannel(ch);
	
	}

}


MainTest 

public class MainTest {
	public static void main(String[] args) {
		TvControl mLGTvControl;
		TvControl mSonyTvControl;
		mSonyTvControl=new TvControl(new SonyControl());
		mLGTvControl=new TvControl(new LGControl());
		mLGTvControl.Onoff();
		mLGTvControl.nextChannel();
		mLGTvControl.nextChannel();
		mLGTvControl.preChannel();
		mLGTvControl.Onoff();
		
		mSonyTvControl.Onoff();
		mSonyTvControl.preChannel();
		mSonyTvControl.preChannel();
		mSonyTvControl.preChannel();
		mSonyTvControl.Onoff();
		
		newTvControl mSharpTvControl;
		mSharpTvControl=new newTvControl(new SharpControl());
		mSharpTvControl.Onoff();
		mSharpTvControl.nextChannel();
		mSharpTvControl.setChannel(9);
		mSharpTvControl.setChannel(28);
		mSharpTvControl.Back();
		mSharpTvControl.Onoff();
		
	}


}


newTvControl 

public class newTvControl extends TvControlabs {
	private  int ch=0;
	private  boolean ison=false;
	private int prech=0;
	public newTvControl(Control mControl) {
		super(mControl);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void Onoff() {
		// TODO Auto-generated method stub

		if(ison)
		{
			ison=false;
			mControl.Off();
		}else{
			ison=true;
			mControl.On();
		}
	
	}

	@Override
	public void nextChannel() {
		// TODO Auto-generated method stub
		prech=ch;
		ch++;
		mControl.setChannel(ch);
	
	}

	@Override
	public void preChannel() {
		// TODO Auto-generated method stub
		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);
	}
}


桥接模式关键点

桥接模式原理

系统有多维角度分类时,而每一种分类又有可能变化,考虑使用桥接模式
桥接的目的是分离抽象与实现,使抽象和实现可以独立变化。


桥接模式与策略模式差异

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

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

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

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

桥接模式强调接口对象仅提供基本操作

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

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/86773794