我们讨论的是向咖啡中加调味剂的问题,(有点像调酒!)
此时的咖啡早已经冲好,并放在一个叫coffee的杯子里面.
现在我们要选择调味剂种类(糖,牛奶等),并记录在纸上(list),然后取出调味剂放入decorator的搅拌器内搅拌成一种新种类的调味剂(甜牛奶),取出新调味剂(get方法)倒入coffee杯子中,一杯甜牛奶咖啡就泡好了.

为什么我们不能直接向咖啡中先加糖再加咖啡呢?
因为banq大虾设计一个单态类(Singleton)来hold当前的CoffeeImp,一杯咖啡中只能加一种调味剂,所以在加之前,糖和牛奶应该先搅拌好!为什么要用单态类(Singleton)来hold当前的CoffeeImp,我还没领悟到!

为什么我们不把甜牛奶当作已有的调味剂呢?
就和调酒为什么是现场调制的问题一样.
如果调味剂种类越多,那么被要求用来分开装调味剂的容器也就更多了.CoffeeImp的子类越多系统的复杂性也就越高!

我们讨论的是向咖啡中加调味剂的问题,(有点像调酒!)
此时的咖啡早已经冲好,并放在一个叫coffee的杯子里面.
现在我们要选择调味剂种类(糖,牛奶等),并记录在纸上(list),然后取出调味剂放入decorator的搅拌器内搅拌成一种新种类的调味剂(甜牛奶),取出新调味剂(get方法)倒入coffee杯子中,一杯甜牛奶咖啡就泡好了.

为什么我们不能直接向咖啡中先加糖再加咖啡呢?
因为banq大虾设计一个单态类(Singleton)来hold当前的CoffeeImp,一杯咖啡中只能加一种调味剂,所以在加之前,糖和牛奶应该先搅拌好!为什么要用单态类(Singleton)来hold当前的CoffeeImp,我还没领悟到!

为什么我们不把甜牛奶当作已有的调味剂呢?
就和调酒为什么是现场调制的问题一样.
如果调味剂种类越多,那么被要求用来分开装调味剂的容器也就更多了.CoffeeImp的子类越多系统的复杂性也就越高!

论坛是不是出问题了啊,发了一次出错,再发一次成功了结果出现两篇.

貌似CoffeeImpSingleton中的getTheCoffeeImp方法就是Bridge模式中的bridge(桥),连接着抽象和行为!

不知道Bridge模式中能不能架两座或两座以上的桥?

Decorator模式昨天刚看到,在Decorator里提到了Strategy模式,貌似可以用下,不过我还没来的及看。

像这样的www.shanglvxing.cn

呵呵,是否使用Decorator模式不应该是这样谈论的。
你可以看看设计模式上面有创建模式 、结构模式 、行为模式的区分,这表示特定情况下使用的模式类型,不能说咖啡加糖一定使用什么模式,而是应该问咖啡加糖之后要做什么,是给一个人品尝还是要罐装生产。

比如星巴克,我来要一杯中杯的卡布其诺,你需要给我加牛奶、奶末以及ESPRESSO,下一个你要的是拿铁,再下一个要马其朵,这时候你就必须为每个种类产生一个新的的Decorator。

其实如果是生产咖啡我觉得使用Chain of Responsibility模式比较好。可以做一个简单的变形。你将所有的加东西的过程串成生产线,将咖啡做好了交给这个生产线。生产线根据你的里面的需要进行生产,如果该步骤需要则加入,不需要则交给下一步骤。最后就可以按照你的要求生产出一份香浓的咖啡。

CoffeeImpSingleton可以设计成通用容器

tellhow 兄,看看这个例子
http://www.jdon.com/jivejdon/thread/9923.html

呵呵,偶也是模式新手,最近学习模式,其实我觉得在学习某种模式的时候,先看一下这个模式具体解决的是什么样子的问题,然后就停下来,自己开始想想具体这个问题怎么解决,想一想你会发现你的想法和这种设计模式不谋而合。以前我都是看完问题描述后直接看源代码,看完了还没有搞清楚,如果先能自己想一下解决方案,再看大师的代码会明白好多。就好比要Adapter模式,它是用已经写好的代码去解决新的
同一类的问题。我们已经有了打方桩的代码,现在想打原桩怎么办呢?仔细想想就是
从方桩继承,在方桩的子类里来实现打园桩,这样客户端的代码还是和方桩打交道,但是此时底层已经是在打圆桩。

Adapter(适配器)举的例子可以;但是没有指出这个类的使用者获得了那些灵活性,其次解说的太糟糕,使人一知半解,难怪上面有这么多道友疑惑;解惑授道?????
[该贴被iWork于2008-03-28 17:05修改过]

关于打桩问题之我的见解,好像这就不属于Adapter模式了吧?
public interface IPeg {
public void insert(String msg);
}
public class SquarePeg implements IPeg {

public void insert(String msg) {
// TODO 自动生成方法存根
System.out.println("SquarePeg insert():"+msg);
}
}
public class RoundPeg implements IPeg {
public void insert(String msg) {
System.out.println("RoundPeg insert():"+msg);
}
}
public class PegAdapter implements IPeg{
private IPeg peg;
public PegAdapter(IPeg peg) {
this.peg=peg;
}
public void setPeg(IPeg peg) {
this.peg=peg;
}
public IPeg getPeg() {
return peg;
}
public void insert(String msg) {
peg.insert(msg);
}
public static void main(String[] args) {
SquarePeg square=new SquarePeg();
RoundPeg round=new RoundPeg();
PegAdapter peg=new PegAdapter(square);
peg.insert("Square");
peg.setPeg(round);
peg.insert("Round");
}
}这个应用是代理模式,把对insert方法的调用都用别的类的insert方法实现,这个类也是IOC模式使用的地方。
[该贴被zjsong于2008-09-18 10:50修改过]
[该贴被zjsong于2010-08-14 09:46修改过]