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)推荐
|