2009-06-09 6 views
3

스윙이 데코레이터 및 옵저버 패턴을 사용하는 방법을 알 수 있습니다.스윙의 명령 패턴 이해

관찰자 : 모든 구성 요소 (예 : JButton)는 observers(ActionListeners)을 추가 할 수있는 대상입니다. 누군가가 버튼을 누르면 ActionListeners에 모두 actionPerformed(ActionEvent e)으로 전화하여 알려줍니다.

하지만 명령 패턴은 어떻습니까?

ActionListener (예 : MyActionListener)을 구현하는 클래스를 만들 때 actionPerformed(ActionEvent e)이 이제 실행 명령입니까?

나는 actionPerformed(ActionEvent e)execute()update() 방법으로 모두 사용된다고 혼란 스럽습니다. 내가 여기 있니?

답변

5

Here is an article that will help. 기본적으로 ActionListener를 파생시켜 대상 개체와 상호 작용하는 구체적인 명령 클래스를 만들 수 있습니다. 그런 다음 액션 이벤트 호출자가 이러한 분리 된 명령을 등록하여 확장 할 수 있습니다.

+0

Thx. 매우 도움이 되었습니까 :) –

+6

링크가 다운되었습니다 .... – KJW

+0

페이지의 링크가 아래로 – jawath

0

흥미롭고 재미 있을지 모르지만, 나는 그것이 수행 된 것으로 보입니다. 수행되는 작업의 이유는 상태 변경 또는 마우스 클릭 일 수 있지만 여전히 명령 패턴 의미의 명령입니다.

3

예, 기본적으로 동작을 캡슐화하는 개체 및 동작이 수행 될 때 필요한 기타 정보는 command pattern을 사용하는 것으로 볼 수 있습니다.

위의 Wikipedia 기사는 Swing의 명령 패턴의 예로 Action 인터페이스를 사용합니다. Action 인터페이스는 ActionListener의 하위 인터페이스이므로 Action을 구현하는 클래스는 actionPerformed 메서드를 구현해야합니다.

따라서 Action을 구현하는 클래스는 동작이 발생할 때 수행되는 일부 작업을 캡슐화합니다. 그리고 그 계급 자체가 명령 패턴을 따르는 것을 볼 수 있습니다.

일반적으로 구현시에는 Action을 구현하는 것보다 AbstractAction을 사용하는 것이 더 간편 할 수 있습니다. 몇 가지 방법을 오버라이드해야하기 때문입니다. AbstractAction를 사용하는 예는 될 수 있습니다

class MySpecialAction extends AbstractAction { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     // Perform operations. 
    } 
} 

MySpecialAction은 명령 패턴 개체입니다 - 그것은 행동이 일어나는 때 전시해야하는 행동이있다. 위의 클래스를 인스턴스화 할 때, 하나는 다음을 시도 할 수 :

MySpecialAction action = new MySpecialAction("Special Action", mySpecialIcon); 

다음 작업은 여러 구성 요소로 등록 할 수 있습니다, 같은 JButton의, JMenuItem의 등을. 각각의 경우에 동일한 MySpecialAction 객체를 호출한다 : 두 경우

JMenuItem specialMenuItem = new JMenuItem(action); 

/* ... */ 

JButton b = new JButton(action); 

, 각 구성 요소는 버튼 메뉴 항목과 연관된 작업을 동일한 MySpecialAction 동작 객체 또는 명령을 참조. 알 수 있듯이 MySpecialAction 객체는 명령 패턴 다음에 객체로 작동합니다. 동작이 수행 될 때 수행 할 일부 동작을 캡슐화하기 때문입니다.

+0

고마워요. 나는 그것을 얻는다. 그러나 내가 원상태로 돌릴 수 있기를 원한다고 해보자. undo() 메소드로 인터페이스 Action을 확장하는 UndoableAction 인터페이스를 만드는 경우. 그런 다음 JButton b = 새 JButton (new MyUndoableAction()); 여전히 실행 취소 기능이 없습니다. –

+0

음, 내 말은 스윙은 실행 취소 방법이 있다는 것을 알 수 없습니다. actionPerfomed()는 버튼을 누를 때 자동으로 호출됩니다. –

+0

@bobjink : 예, JButton은 MyUndoableAction이 아닌 Action을 기대하므로 "실행 취소"하는 방법을 알지 못하므로 undo() 메소드를 호출하지 않습니다. MyUndoableAction이 전달 된 객체는 실행 취소를 구현하는 방법을 알아야합니다. 좋은 리소스를 가리킬 수는 없지만 실행 취소를 구현하는 데는 몇 가지 방법이 있다고 생각됩니다. (계속 ...) – coobird