2012-09-29 4 views
1

난 내가 다른 사용자 역할을 구현하기위한 데코레이터 패턴을 사용한 응용 프로그램이 있습니다 .. 응용 프로그램을 만들기위한 내 기본 참조는이 링크에서 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

당신은 'feature'에 대해 더 구체적 일 수 있습니까? 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) {} 
}