精华帖 (0) :: 良好帖 (7) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-19
最后修改:2009-02-19
装饰者模式MM们要过生日了 ,怎么也得表示下吧。最起码先送个蛋糕。蛋糕多种多样了。巧克力,冰淇淋,奶油等等。这都是基本的了 ,再加点额外的装饰,如蛋糕里放点花。放贺卡。放点干果吃着更香等等。看看我是如何设计的。
那么我要好好思考这个问题了。发现了刚才的设计确实有问题。。发现了真正的要关注的主体是蛋糕。。而贺卡,花,果仁等等只不过是装饰 的作用。
思路来了。蛋糕作为主体,其他的东西都加到蛋糕上。MM要啥我就加啥呗。呵呵。 到现在我们要明确的是:
来看看什么是装饰器模式吧: 动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
说完理论了。可能还一头雾水吧。。。还是接着蛋糕的例子继续说。先看图吧。
Cakepackage decorator.demo; /** * 蛋糕基类 * @author Nicholas * */ public abstract class Cake { String remark = "蛋糕"; public String getRemark() { return remark; } public abstract String getImpression();//用来描述吃蛋糕的感觉。。。。 } Cake是个抽象类,它已经实现了getRemark的方法。但没有实现getImpression.这个方法必须被子类实现。
再看看装饰器的抽象类 OtherDecoratorpackage decorator.demo; /** * 其他用来添加蛋糕的东西 * @author Nicholas * */ public abstract class OtherDecorator extends Cake{ Cake cake; /** * 引用一个Cake. * 让被装饰者进入装饰者之中。这里用的是构造方法注入。 * 这样就可以调用Cake实例的方法了。 * @param cake */ public OtherDecorator(Cake cake){ this.cake=cake; } /** * 让装饰器的子类都去实现getRemark方法。业务需要每个装饰器都要有描述。 */ public abstract String getRemark(); } 下面让我们实现一个蛋糕吧。^_^。。 package decorator.demo; /** * 乳酪蛋糕 * @author Nicholas * */ public class CheeseCake extends Cake{ /** * 乳酪蛋糕的构造方法 */ public CheeseCake(){ super.remark="乳酪蛋糕";//修改乳酪蛋糕的描述。 } /** * 实现了Cake抽象类的getImpression * 吃乳酪蛋糕的感觉。。 */ public String getImpression() { return "香甜感受"; } } 其他实现Cake的类就不列出了,道理是一样的。 下面我们要开始实现具体的装饰器了。 package decorator.demo; /** * 给蛋糕添加的花 * @author Nicholas * */ public class FlowerDecorator extends OtherDecorator{ /** * 构造函数 * 传入一个cake实例,也就是前面所实现的Cake的子类,如奶酪蛋糕,巧克力蛋糕等等。 * @param cake */ public FlowerDecorator(Cake cake){ super(cake);//调用父类的构造方法,可以获取Cake的实例了。就可以调用Cake实例的方法. super.remark="一朵玫瑰花"; } /** * 实现了装饰器抽象类的getImpression方法。 */ public String getImpression() { //这是重点。我们通过构造方法传入的cake实例。对cake进行了装饰,增加了新的功能。 return cake.getImpression()+","+"看到一朵花真是happy"; } public String getRemark() { return cake.getRemark()+"+"+super.remark; } } 到现在终于大功告成了。。这样方便了很多,可以通过装饰器生成很多种类的蛋糕。 package decorator.demo; public class MyGirlB { public static void main(String[] args){ //用果仁,花包装巧克力蛋糕。 Cake nutsFlowerChocolateCake = new NutsDecorator(new FlowerDecorator(new ChocolateCake())); System.out.println("remark "+nutsFlowerChocolateCake.getRemark()); //吃蛋糕的感受已经发生了改变。 System.out.println("impression "+nutsFlowerChocolateCake.getImpression()); } } 这个模式的缺点也挺明显的 ,看看如下图片
为了扩展cake的功能,加入了许多的装饰类。。当然用户也可以继承OtherDecorator来继续扩展。但是对API使用者是个困扰。。所以API要说明哪些类是用来包装的。。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-06
最后修改:2010-01-06
你没有说出问题的本质。装饰的重点不在你说的地方,而在于主体和装饰者的关系。你的例子没有围绕重点去讲。只能说是一般性的理解。
|
|
返回顶楼 | |
浏览 18920 次