分享

GoF设计模式之九 Decorator- -

 wtf_soft 2005-07-22

 

                                      

    B4) Decorator(修饰者模式)
    定义:动态的在一个对象上附加一些额外的职责。修饰者为扩充功能提供一个灵活的对子类的选择。
    修饰者就是一个中间商,从供应商那里拿到货,然后重新包装修饰一下,提供给客户。这个模式也非常有用,我觉得用它来完成复杂的数据变化或检查非常合适,比如filter或validator。用个validator的实例来说明一下吧。首先,我们需要一个validator来检查日期数据的有效性。
    public interface DateValidator {
        public boolean isValid();
    }

    对于日期的检验为(只检查长度)
    public NormalDate implements DateValidator {
        private String date;
        public NormalDate(String date) {
            this.date = date;
        }
        public boolean isValid() {
            if (data == null || data.length() != 8) {
                return false;
            }
            return true;
        }
        public String getDate() {
            return date;
        }
    }

    对于生日日期的检验为(不能是未来出生)
    public Birthday implements Validator {
        private DateValidator validator;
        public Birthday(DateValidator validator) {
            this.validator = validator;
        }
        public boolean isValid() {
            if (validator.isValid()) {
                if (validator.getDate().compareTo(now) > 0) {  //now is "20050201"
                    return false;
                }
                return true;
            }
            return false;
        }
    }
    那检验生日的过程如下
    DateValidator normalDate = new NormalDate("20050714");
    DateValidator birthday = new Birthday(normalDate);
    return birthday.isValid(); //false will be returned
    到这里,一个修饰模式就完成。那如果要扩展日期检验,假设日期年是用2位而不是4位表示,而且要进行其他检查(如全部为半角数字,日期合法等),那对于日期的检验就变成
    public SpecialDate implements DateValidator {
        private String date;
        public SpecialDate(String date) {
            this.date = date;
        }
        public boolean isValid() {
            if (data == null || data.length() != 6) {
                return false;
            }
            // other dateCheck
            return true;
        }
        public String getDate() {
            return toNormal(date);  // "020524" -> "20020524"
        }
    }
    那检验生日的过程如下
    DateValidator specialDate = new SpecialDate("020524");
    DateValidator birthday = new Birthday(specialDate);
    return birthday.isValid(); //true will be returned


   参考:
1、 http://www./designpatterns/decorator.htm(中文、java实例)
2、 http://www./Patterns/PatternDecorator.aspx(英文、C#实例、UML)
3、 http://www./tech/DesignPattern/Decorator.html(日文、java实例、UML)推荐

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多