论坛首页 编程语言技术论坛

装饰者模式实践

浏览 6831 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-10  

 今天接到PD给的一个需求,我大概描述一下:

  1. 需要给报名了某个活动的商品打上一个主要的标记,记作:标记A
  2. 如果该商品的库存件数在100件以上并且是在该活动内首次上架,则再加一个标记,标为:标记B
  3. 如果该商品单日销量超过预期的销量后,则继续加上一个标记,记作:标记C
  4. 还有符合其他等等条件的商品还会标记上各种其他标记,每种条件一种标记。

注:只要是该活动的商品,则肯定存在标记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
add hot-sale-tag
add new-goods-tag

 

各位大神还有没有更好的点子?欢迎拍砖。

  • 大小: 13.6 KB
   发表时间:2012-02-13  
用什么模型存储数据呢
0 请登录后投票
   发表时间:2012-03-07  
模式很不错。我觉得成员变量最好不要用public修饰,这样破坏了封装性。
0 请登录后投票
   发表时间:2012-11-20  
感觉用接口是不是更好点...
0 请登录后投票
   发表时间:2012-11-20  
小弟有点迷惑啊,你上面的例子只是标志C为A做了装饰。那我如果要同时装饰B,C呢?
0 请登录后投票
   发表时间:2012-11-27  
如果需求增加一个标记是否要增加一个子类呢?这样就需要上一个版本,上版本是很痛苦的事情,在很规范的企业里。
0 请登录后投票
   发表时间:2012-11-27  
主体对象是什么?消费对象是什么?OO是要封装变化,你这里的变化是打标记?你一个动作用一个类,应该是策略模式。分析出什么是主体对象、消费对象,并且他们都有那些属性。我觉得,这里的主体对象是商品,当它到了某个状态的时候,他的行为(打标记)就改变了。  考虑一下状态模式
0 请登录后投票
   发表时间:2012-12-01  
devroller2 写道
主体对象是什么?消费对象是什么?OO是要封装变化,你这里的变化是打标记?你一个动作用一个类,应该是策略模式。分析出什么是主体对象、消费对象,并且他们都有那些属性。我觉得,这里的主体对象是商品,当它到了某个状态的时候,他的行为(打标记)就改变了。  考虑一下状态模式

不是策略模式,可以多个标志的。。。。实现就好。。。

如果是我的话会:
把标志的条件作为规则,
每个商店走一遍所有规则,
符合规则打标志。
PS:规则抽象出来,用外部配置(DB或XML)
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics