我工作的那點事--學習《設計模式》例項應用(decorator模式)

biqing0427發表於2007-12-06
今天是我們公司寫週報的日子,又要回顧一下一週的工作、學習任務了,感覺這周沒有做什麼事情,專案剛結束,只有看看書了。

上午剛好看到Decorator這個模式,為了增強學習,就將週報這個例項和它強行綁在一起了,呵呵。[@more@]

這裡還是簡單的介紹一下Decorator模式吧:
定義:
在不改變原來物件的結構基礎上,動態給一個物件新增一些額外的職責.如果使用子類繼承的話,對於每個類的改變都要產生新類,增加了開銷。現在這些功能需要由使用者動態決定加入的方式和時機.

下面用例項說明一下:

公司的週報彙報關係是:開發員->專案經理->部門經理->CTO

先生成周報吧:
1. WeeklyReport

public interface WeeklyReport {
//這裡為了簡單說明 只理出週報內容
public String decription();
}

下面我們假設有FellowOne,FellowTwo,FellowThree三個開發員

每個員工只有寫週報內容這一個功能。

//FellowOne
public class FellowOne implements WeeklyReport {
private String content = "";

public void setContent(String content) {
this.content = content;
}

public String getContent() {
return content;
}

public String decription() {
String retStr = "";
retStr = "FellowOne:" + content;
return retStr;
}

}

//FellowTwo
public class FellowTwo implements WeeklyReport {
private String content = "";

public void setContent(String content) {
this.content = content;
};

public String getContent() {
return content;
}

public String decription() {
String retStr = "";
retStr = "FellowTwo:" + content;
return retStr;
}
}

//FellowThree
public class FellowThree implements WeeklyReport{
private String content = "";

public void setContent(String content) {
this.content = content;
};

public String decription() {
String retStr = "";
retStr = "FellowThree:" + content;
return retStr;
}

public String getContent() {
return content;
}
}

現在開發員的週報寫好了,將要發給專案經理,經理肯定要對每個人的週報進行修改,再加上自己的工作內容,才能一起發給部門經理。

如果經理對每個員工的週報進行修改都產生一個類,那麼將新增加3個類,如果有100個員工,那將增加100個子類,太龐大了,下面看看Decorator的作用吧,一個類搞定。

2.經理的週報:Decorator
當然也是週報的一種,所以肯定也是implements WeeklyReport了。
public class Decorator implements WeeklyReport {

private WeeklyReport report;
private List list = new ArrayList();

//預設對一份週報進行修改
public Decorator(WeeklyReport report) {
this.report = report;
}

//一個經理下面肯定有很多開發者的,這裡增加他們的週報
public void addWeeklyReport(WeeklyReport report) {
list.add(report);
}

//經理將所有的週報整理 加上自己的東西,形成周報
public String decription() {
String retStr = "nmy Team this week do works:n";
retStr += report.decription() + "n";
for (int i = 0; i < list.size(); i++) {
retStr += ((WeeklyReport) list.get(i)).decription()+"n";
}
System.out.println(retStr);
return retStr;
}
}

3.讓我們看看部門經理的週報 是怎麼寫的吧:
同理部門經理面對的是各個專案經理
public class SubDecorator implements WeeklyReport {

//很明顯,部門經理關心的也是週報,
//不過只是從專案經理那邊發過來的
private WeeklyReport report;

public SubDecorator(WeeklyReport report) {
this.report = report;
}

//對每份週報進行處理
public String decription() {
String retStr = "nmy department this week finish:";
System.out.println(retStr+report.decription());
return retStr;
}
}

為了簡化程式,這裡就認為是一個部門經理下面對應一個專案經理,而且預設部門經理不再向上彙報了。

4.讓我們看看整個週報的流程吧:

FellowOne one = new FellowOne();
FellowTwo two = new FellowTwo();
FellowThree three = new FellowThree();

one.setContent("study");//fellowOne寫週報
two.setContent("nothing");//fellowTwo寫週報
three.setContent("finish part A");//fellowThree的週報

//看看專案經理怎麼寫週報的
Decorator decorator = new Decorator(one);
decorator.addWeeklyReport(two);
decorator.addWeeklyReport(three);

//部門經理得到的只是專案經理的週報,多簡單,
//不用管開發者的具體工作,
//專案經理已經寫好了
SubDecorator subdec = new SubDecorator(decorator);
subdec.decription();

//專案經理的週報
my Team this week do works:
FellowOne:study
FellowTwo:nothing
FellowThree:finish part A

//部門經理的週報
my department this week finish:
my Team this week do works:
FellowOne:study
FellowTwo:nothing
FellowThree:finish part A

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9879276/viewspace-989108/,如需轉載,請註明出處,否則將追究法律責任。

相關文章