版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}
}
桥接模式关键点
桥接模式原理
系统有多维角度分类时,而每一种分类又有可能变化,考虑使用桥接模式
桥接的目的是分离抽象与实现,使抽象和实现可以独立变化。
桥接模式与策略模式差异
桥接的目的是让底层实现和上层接口可以分别演化,从而提高移植性
策略的目的是将复杂的算法封装起来,从而便于替换不同的算法
桥接模式是往往是为了利用已有的方法或类
策略模式是为了扩展和修改,并提供动态配置
桥接模式强调接口对象仅提供基本操作
策略模式强调接口对象提供的是一种算法