我看了半天的教程,怎么也没法理解bridge模式和adapter模式有啥区别,就拿网上教材比较流行的一个例子来说,一杯咖啡为例,有中杯和大杯之分,同时还有加奶 不加奶之分.
网上的设计方法是先抽象一个Coffee的抽象类
public abstract class Coffee
{
CoffeeImp coffeeImp; public void setCoffeeImp() {
this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();
} public CoffeeImp getCoffeeImp() {return this.CoffeeImp;} public abstract void pourCoffee();
}其中CoffeeImp 是加不加奶的行为接口
public abstract class CoffeeImp
{
public abstract void pourCoffeeImp();
}接下来继承Cofee类实现一个中杯,一个大杯的class
//中杯
public class MediumCoffee extends Coffee
{
public MediumCoffee() {setCoffeeImp();} public void pourCoffee()
{
CoffeeImp coffeeImp = this.getCoffeeImp();
//我们以重复次数来说明是冲中杯还是大杯 ,重复2次是中杯
for (int i = 0; i < 2; i++)
{ coffeeImp.pourCoffeeImp();
}
}
}//大杯
public class SuperSizeCoffee extends Coffee
{
public SuperSizeCoffee() {setCoffeeImp();} public void pourCoffee()
{
CoffeeImp coffeeImp = this.getCoffeeImp();
//我们以重复次数来说明是冲中杯还是大杯 ,重复5次是大杯
for (int i = 0; i < 5; i++)
{ coffeeImp.pourCoffeeImp();
}
}
}实现CofeeImp的两个class
//加奶
public class MilkCoffeeImp extends CoffeeImp
{
MilkCoffeeImp() {} public void pourCoffeeImp()
{
System.out.println("加了美味的牛奶");
}
}//不加奶
public class FragrantCoffeeImp extends CoffeeImp
{
FragrantCoffeeImp() {} public void pourCoffeeImp()
{
System.out.println("什么也没加,清香");
}
}再设计一个单态类(Singleton)用来hold当前的CoffeeImp
public class CoffeeImpSingleton
{
private static CoffeeImp coffeeImp; public CoffeeImpSingleton(CoffeeImp coffeeImpIn)
{this.coffeeImp = coffeeImpIn;} public static CoffeeImp getTheCoffeeImp()
{
return coffeeImp;
}
}使用时:
//拿出牛奶
CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());//中杯加奶
MediumCoffee mediumCoffee = new MediumCoffee();
mediumCoffee.pourCoffee();//大杯加奶
SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();
superSizeCoffee.pourCoffee();我现在看到具体的实现类MediumCoffee,SuperSizeCoffee继承了抽象类Coffee,Coffee中又持有了CoffeeImp抽象类,可以根据不同的需要在具体coffee实现类构造时set进具体的CoffeeImp实现,那么整个思想不就是一个Adapter么?为什么又要来个Bridge模式呢?这两个模式到底啥区别?
网上的设计方法是先抽象一个Coffee的抽象类
public abstract class Coffee
{
CoffeeImp coffeeImp; public void setCoffeeImp() {
this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();
} public CoffeeImp getCoffeeImp() {return this.CoffeeImp;} public abstract void pourCoffee();
}其中CoffeeImp 是加不加奶的行为接口
public abstract class CoffeeImp
{
public abstract void pourCoffeeImp();
}接下来继承Cofee类实现一个中杯,一个大杯的class
//中杯
public class MediumCoffee extends Coffee
{
public MediumCoffee() {setCoffeeImp();} public void pourCoffee()
{
CoffeeImp coffeeImp = this.getCoffeeImp();
//我们以重复次数来说明是冲中杯还是大杯 ,重复2次是中杯
for (int i = 0; i < 2; i++)
{ coffeeImp.pourCoffeeImp();
}
}
}//大杯
public class SuperSizeCoffee extends Coffee
{
public SuperSizeCoffee() {setCoffeeImp();} public void pourCoffee()
{
CoffeeImp coffeeImp = this.getCoffeeImp();
//我们以重复次数来说明是冲中杯还是大杯 ,重复5次是大杯
for (int i = 0; i < 5; i++)
{ coffeeImp.pourCoffeeImp();
}
}
}实现CofeeImp的两个class
//加奶
public class MilkCoffeeImp extends CoffeeImp
{
MilkCoffeeImp() {} public void pourCoffeeImp()
{
System.out.println("加了美味的牛奶");
}
}//不加奶
public class FragrantCoffeeImp extends CoffeeImp
{
FragrantCoffeeImp() {} public void pourCoffeeImp()
{
System.out.println("什么也没加,清香");
}
}再设计一个单态类(Singleton)用来hold当前的CoffeeImp
public class CoffeeImpSingleton
{
private static CoffeeImp coffeeImp; public CoffeeImpSingleton(CoffeeImp coffeeImpIn)
{this.coffeeImp = coffeeImpIn;} public static CoffeeImp getTheCoffeeImp()
{
return coffeeImp;
}
}使用时:
//拿出牛奶
CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());//中杯加奶
MediumCoffee mediumCoffee = new MediumCoffee();
mediumCoffee.pourCoffee();//大杯加奶
SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();
superSizeCoffee.pourCoffee();我现在看到具体的实现类MediumCoffee,SuperSizeCoffee继承了抽象类Coffee,Coffee中又持有了CoffeeImp抽象类,可以根据不同的需要在具体coffee实现类构造时set进具体的CoffeeImp实现,那么整个思想不就是一个Adapter么?为什么又要来个Bridge模式呢?这两个模式到底啥区别?
解决方案 »
- 急需解决的问题
- spring3.0 restful
- getJdbcTemplate().queryForList()的问题
- 这个问题困惑好久了!怎么解决?
- hibennate的org.springframework.dao.DataIntegrityViolationException Could not execute JDBC batch update; 怎么改啊
- 总是报错:语法错误,将“AssignmentOperator 表达式”插入到完整 表达式 中。。。。并且不能删除
- [求助]监听器启动出了这个错误怎么搞的?....搞的焦头烂额了..
- eclipse运行环境的配置
- 请问各位大侠,如何在Jsp中使用JDBC来联结Foxpro?
- 如何调试EJB
- hibernate更新数据 Oracle没有自动提交 如何设置?
- struts2 json返回异常,请高手指点
我们常说,要优先使用类组合而不是类继承,但是这个组合说起来荣日,实质上怎么做?bridge做的就是如何实现类组合。你看看自己提供的例子,是不是一个类组合的实例?
adapter顾名思义,一个类提供了名字叫method1的方法,但是主程序的架构上只能用实现了某接口或者某个类的子类的方法,其方法名叫method2,这是就可以用一个这个模式把method1委托给你的adapter的method2方法