桥接模式(Bridge)是关注抽象类的的设计模式。桥接模式的意图是将抽象类与抽象方法的实现相互分离来实现解耦,以便二者可以相互独立地变化。
比如面馆的面条,有的人喜欢吃的辣一点,有人喜欢淡一点;有的人爱吃牛肉面,有人爱吃三鲜面。不管是什么面都是面条。但是每种面条的口味可以按个人的喜好进行调节。这个场景就可以使用桥接模式很好的解决。
/**
* 面条的抽象类
* @author Lenovo
* @version $Id: Noodle.java, v 0.1 2014年9月26日 下午5:26:06 Lenovo Exp $
*/
public abstract class Noodle {
/**
* 苗条的口味风格
*/
private Style style;
public Noodle(Style style) {
super();
this.style = style;
}
public void eat() {
System.out.println("吃 " + style.getPreference() + " 一点的 " + getName() + " 面条");
}
/**
* 抽象方法,获取面条的类型
*
* @return
*/
protected abstract String getName();
/**
* Getter method for property style.
*
* @return property value of style
*/
public Style getStyle() {
return style;
}
/**
* Setter method for property style.
*
* @param style value to be assigned to property style
*/
public void setStyle(Style style) {
this.style = style;
}
}
/**
*
* @author Lenovo
* @version $Id: Style.java, v 0.1 2014年9月26日 下午5:24:35 Lenovo Exp $
*/
public interface Style {
/**
* 获取跟人的偏好
*
* @return
*/
public String getPreference();
}
目前面馆提供两种面条,牛肉面,三鲜面
/**
*
* @author Lenovo
* @version $Id: BeefNoodle.java, v 0.1 2014年9月26日 下午5:35:20 Lenovo Exp $
*/
public class BeefNoodle extends Noodle {
/**
* @param style
*/
public BeefNoodle(Style style) {
super(style);
}
/**
* @see com.cathy.demo.pattern.bridge.Noodle#getName()
*/
@Override
protected String getName() {
return "牛肉";
}
}
/**
*
* @author Lenovo
* @version $Id: SeafoodNoodle.java, v 0.1 2014年9月26日 下午5:36:33 Lenovo Exp $
*/
public class SeafoodNoodle extends Noodle {
/**
* @param style
*/
public SeafoodNoodle(Style style) {
super(style);
}
/**
* @see com.cathy.demo.pattern.bridge.Noodle#getName()
*/
@Override
protected String getName() {
return "三鲜";
}
}
/**
*
* @author Lenovo
* @version $Id: HotStyle.java, v 0.1 2014年9月26日 下午5:37:38 Lenovo Exp $
*/
public class HotStyle implements Style {
/**
* @see com.cathy.demo.pattern.bridge.Style#getPreference()
*/
public String getPreference() {
return "辣";
}
}
/**
*
* @author Lenovo
* @version $Id: LightStyle.java, v 0.1 2014年9月26日 下午5:38:18 Lenovo Exp $
*/
public class LightStyle implements Style {
/**
* @see com.cathy.demo.pattern.bridge.Style#getPreference()
*/
public String getPreference() {
return "清淡";
}
}
测试:
/**
*
* @author Lenovo
* @version $Id: Client.java, v 0.1 2014年9月26日 下午5:36:54 Lenovo Exp $
*/
public class Client {
/**
*
* @param args
*/
public static void main(String[] args) {
Noodle n = new BeefNoodle(new HotStyle());
n.eat();
n = new BeefNoodle(new LightStyle());
n.eat();
n = new SeafoodNoodle(new HotStyle());
n.eat();
n = new SeafoodNoodle(new LightStyle());
n.eat();
}
}
结果是:
吃 辣 一点的 牛肉 面条
吃 清淡 一点的 牛肉 面条
吃 辣 一点的 三鲜 面条
吃 清淡 一点的 三鲜 面条