桥接模式是一种结构型模式,主要应对的是:由于实际的需要,某个类具有俩个或俩个以上维度的变化,如果只是使用继承将无法实现这种需求,或者使得设计变得相当臃肿。
举例来说
1.假设现在我们需要为某个餐厅制造菜单,餐厅供应牛肉面、猪肉面,又有口味是否添加辣椒(无辣、微辣等等),假如后面还要添加新的风格呢?如果使用继承方式,每种都需要实现不同的子类;此时可以采用桥接模式,将变化的部分抽象出来,使变化部分与主类分离,最后提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需求。
2.假设在一块画布上,要画一个正方形或菱形或一个图片等,或者要拖动或选择,假如某一天又需要添加在这俩个维度上的动作,也可以采用桥接模式来满足该需求。
实例代码:
1.提供一个辣椒风格的接口:
public interface Peppery
{
String style();
}
然后实现俩种辣椒风格:
public class PepperySytle implements Peppery
{
//实现"辣味"风格的方法
public String style()
{
return "辣味很重,很过瘾...";
}
}
public class PlainStyle implements Peppery
{
//实现"不辣"风格的方法
public String style()
{
return "味道清淡,很养胃...";
}
}
2.提供一个面条的抽象类:
public abstract class AbstractNoodle
{
//组合一个Peppery变量,用于将该维度的变化独立出来
protected Peppery style;
//每份Noodle必须组合一个Peppery对象
public AbstractNoodle(Peppery style)
{
this.style = style;
}
public abstract void eat();
}
然后实现俩种不同的面:
public class PorkyNoodle extends AbstractNoodle
{
public PorkyNoodle(Peppery style)
{
super(style);
}
//实现eat()抽象方法
public void eat()
{
System.out.println("这是一碗稍嫌油腻的猪肉面条。"
+ super.style.style());
}
}
public class BeefNoodle extends AbstractNoodle
{
public BeefNoodle(Peppery style)
{
super(style);
}
//实现eat()抽象方法
public void eat()
{
System.out.println("这是一碗美味的牛肉面条。"
+ super.style.style());
}
}
测试类:
public class Test
{
public static void main(String[] args)
{
//下面将得到“辣味”的牛肉面
AbstractNoodle noodle1 = new BeefNoodle(
new PepperySytle());
noodle1.eat();
//下面将得到“不辣”的牛肉面
AbstractNoodle noodle2 = new BeefNoodle(
new PlainStyle());
noodle2.eat();
//下面将得到“辣味”的猪肉面
AbstractNoodle noodle3 = new PorkyNoodle(
new PepperySytle());
noodle3.eat();
//下面将得到“不辣”的猪肉面
AbstractNoodle noodle4 = new PorkyNoodle(
new PlainStyle());
noodle4.eat();
}
}
至此,通过不同的组合,可以实现不同风格的面条,而辣味接口,也可以使用到其他的菜系里,实现复用性;