B4) Decorator(修飾者模式) 定義:動態(tài)的在一個對象上附加一些額外的職責(zé)。修飾者為擴充功能提供一個靈活的對子類的選擇。 修飾者就是一個中間商,從供應(yīng)商那里拿到貨,然后重新包裝修飾一下,提供給客戶。這個模式也非常有用,我覺得用它來完成復(fù)雜的數(shù)據(jù)變化或檢查非常合適,比如filter或validator。用個validator的實例來說明一下吧。首先,我們需要一個validator來檢查日期數(shù)據(jù)的有效性。 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 到這里,一個修飾模式就完成。那如果要擴展日期檢驗,假設(shè)日期年是用2位而不是4位表示,而且要進行其他檢查(如全部為半角數(shù)字,日期合法等),那對于日期的檢驗就變成 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)推薦
|