2012-09-29 86 views
1

我已經在那裏我已經使用Decorator模式實現不同的用戶角色的應用程序。對於創建應用程序我的基本參考是從這個鏈接 http://zishanbilal.com/2011/04/28/design-patterns-by-examples-decorator-pattern/裝飾模式問題?

我的問題

  1. 如果TeamLeader希望享受TeamMember的任何功能如何完成。因爲在這種情況下我們不能使用Inteface變量。 即

    // Cannot use this 
    Employee emp = new TeamLeader(new TeamMember(new EmployeeImpl())); 
    
  2. 如果我去繼承,我認爲它可以輕鬆很多工作要做。那麼裝飾模式有什麼用?

感謝

+0

你可以更具體的'功能'? TeamLeader,TeamMember和Employee類提供了哪些方法?我的意思是你想要完成的一個例子會有所幫助。 – nansen

回答

4

裝飾模式是最好的,當裝飾修改在接口中的方法的行爲。裝飾者可以添加方法,但添加的方法在包裝另一個裝飾器時不會執行。

在這個例子中,的確,如果你有

Employee emp = new TeamLeader(new TeamMember(new EmployeeImpl())); 

emp沒有訪問TeamMember具體方法。

這意味着該模式可能不是一個好的選擇的情況。

當然,你可以做

TeamMember member = new TeamMember(new EmployeeImpl()); 
TeamLeader leader = new TeamLeader(member); 

,然後訪問從右邊變量的具體方法和無論從界面的方法。

但我會說這可能只是不適合使用這種模式。

+0

我也一樣認爲..因爲它不能正確地使用界面..你可以請建議任何設計模式來實現這個?基本上我有4組用戶角色 – Anish

1

在你的裝飾類中,你需要爲裝飾對象保留一個實例變量。通過這種方式,您的emp對象可以訪問員工,團隊成員和團隊負責人的方法和變量。我已經使用了這個sample-usage-of-decorator-pattern

object(Admin)#18 (4) { 
["admin"]=> string(9) "Admin Obj" 
["user"]=> object(Customer)#15 (4) { 
    ["customer"]=> string(12) "Customer Obj" 
    ["communication"]=>object(Email)#14 (0) {} 
    ["dbms"]=> object(Mysql)#13 (0) {} 
    ["user"]=> object(Visitor)#12 (3) { 
    ["Visitor"]=>string(11) "Visitor Obj" 
    ["communication"]=>object(Email)#11 (0) {} 
    ["dbms"]=>object(Mysql)#10 (0) {} 
    } 
} 
["communication"]=> object(Email)#17 (0) {} 
["dbms"]=>object(Mysql)#16 (0) {} 
}