浏览 6917 次
锁定老帖子 主题:装饰者模式实践
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-10
今天接到PD给的一个需求,我大概描述一下:
注:只要是该活动的商品,则肯定存在标记A,其他都是可选的。
经过分析,个人觉得该业务场景很适合用装饰者模式来解决。 该模式的具体细节不多描述。。。度娘一下,你就知道。
《HeadFirst设计模式》 写道
动态地将责任附加到对象上。想要扩展功能,装饰者提供 有别于继承的另一种选择。
该场景中标记B、标记C等都是为标记A做装饰的。
下面附上本人的简单实现:
装饰者模式类图:
包结构:
public abstract class TagComponent { public String tagName = "base-tag"; public abstract void addTag(); } /**标记A,被装饰者**/ public class BrandSaleTag extends TagComponent { public BrandSaleTag() { tagName = "brand-sale-tag"; } public void addTag() { System.out.println(tagName); } } /**装饰者基类**/ public abstract class TagDecorator extends TagComponent { @Override public abstract void addTag(); } /**标记C,装饰者**/ public class HotSaleTag extends TagDecorator { TagComponent tagComponent; public HotSaleTag(TagComponent tagComponent) { tagName = "hot-sale-tag"; this.tagComponent = tagComponent; } @Override public void addTag() { tagComponent.addTag(); // 需要添加的操作(装饰) addHotSaleTag(); } private void addHotSaleTag() { System.out.println("add " + tagName); } } /**标记B,装饰者**/ public class NewGoodsTag extends TagDecorator { TagComponent tagComponent; public NewGoodsTag(TagComponent tagComponent) { this.tagComponent = tagComponent; tagName = "new-goods-tag"; } @Override public void addTag() { tagComponent.addTag(); // 需要添加的操作(装饰) addNewGoodsTag(); } private void addNewGoodsTag() { System.out.println("add " + tagName); } } public class TagTest { /** * @author hemaodong * @param args */ public static void main(String[] args) { TagComponent tagComponent = new BrandSaleTag(); TagDecorator decorator = new NewGoodsTag(new HotSaleTag(tagComponent)); decorator.addTag(); } }
打印结果: brand-sale-tag
各位大神还有没有更好的点子?欢迎拍砖。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-02-13
用什么模型存储数据呢
|
|
返回顶楼 | |
发表时间:2012-03-07
模式很不错。我觉得成员变量最好不要用public修饰,这样破坏了封装性。
|
|
返回顶楼 | |
发表时间:2012-11-20
感觉用接口是不是更好点...
|
|
返回顶楼 | |
发表时间:2012-11-20
小弟有点迷惑啊,你上面的例子只是标志C为A做了装饰。那我如果要同时装饰B,C呢?
|
|
返回顶楼 | |
发表时间:2012-11-27
如果需求增加一个标记是否要增加一个子类呢?这样就需要上一个版本,上版本是很痛苦的事情,在很规范的企业里。
|
|
返回顶楼 | |
发表时间:2012-11-27
主体对象是什么?消费对象是什么?OO是要封装变化,你这里的变化是打标记?你一个动作用一个类,应该是策略模式。分析出什么是主体对象、消费对象,并且他们都有那些属性。我觉得,这里的主体对象是商品,当它到了某个状态的时候,他的行为(打标记)就改变了。 考虑一下状态模式
|
|
返回顶楼 | |
发表时间:2012-12-01
devroller2 写道 主体对象是什么?消费对象是什么?OO是要封装变化,你这里的变化是打标记?你一个动作用一个类,应该是策略模式。分析出什么是主体对象、消费对象,并且他们都有那些属性。我觉得,这里的主体对象是商品,当它到了某个状态的时候,他的行为(打标记)就改变了。 考虑一下状态模式 不是策略模式,可以多个标志的。。。。实现就好。。。 如果是我的话会: 把标志的条件作为规则, 每个商店走一遍所有规则, 符合规则打标志。 PS:规则抽象出来,用外部配置(DB或XML) |
|
返回顶楼 | |