문제

Photoshop과 같은 도구에는 클릭 할 수있는 다양한 도구가 있습니다 (예 : 펜, 브러시 등). 도구를 클릭하면 선택한 도구에 따라 해당 도구를 사용하여 페인트, 지우기 등을 사용할 수 있습니다.

나는 그것이 OO 디자인에서 어떻게 가장 잘 구현 될지 궁금합니다. 나는 어떤 도구가 선택되는지 항상 알고있는 guimanager 만 있다고 생각할 수 있고, 캔버스 (도면 영역)가 마우스 클릭 또는 마우스 드래그를 감지하면 Guimanager에게 어떤 도구를 선택하고 해당 도구의 동작을 적용합니다.

누구든지 클래스 수준 세부 사항 (또는 시간이없는 경우 세부 사항)에서 가능한 솔루션을 설명합니까?

도움이 되었습니까?

해결책

살펴보십시오 상태 패턴 정확히 당신의 예제가 있습니다.

그러나 실제로 GUI 질문이 아니라이 문제를 모델링하는 방법에 대한 객체 지향적 접근 방식에 더 적합합니다. GUI는 실제로 이것에 속하지 않습니다.

다른 팁

나는 모든 그래픽 요소가 선택한 GUI의 일반적인 기본 클래스에서 파생된다는 점을 제외하고는 OO 원칙이 실제로 이것에 재생되는지 확실하지 않습니다.

화면 메뉴의 계층 구조가 필요한 애플리케이션의 복잡성은 아마도 작곡 대 상속 대 기능 스타일 대 want의 차이를 난쟁합니다.

다른 스타일을 사용하여 프로그램을 두 번 작성하도록 동기를 부여해야하지만 결과를 보는 것이 흥미로울 수 있습니다. 다양한 프로그래밍 스타일의 순위는이 시점에서 실제 답변이없는 공개적인 질문이지만, 우리는 아직 완전히 정량화되지 않은 방식으로 OO 스타일이 중요하다고 생각합니다.

이에 대한 한 가지 아이디어는 도구 클래스를 갖는 것입니다. 의사 코드와 같은 C ++에서 이것을 스케치합니다.

class Tool
{
public:
    // Keep a pointer to the "document", i.e. some representation of the
    // image you are editing
    Tool(Document *pDoc);

    // Process mouse events -- this need to be overridden to execute
    // the appropriate behaviour depending on the concrete type of tool
    virtual void OnMouseEvent(const MouseEvent &e) = 0;

    // and so on
};

그런 다음이 추상 도구 클래스에서 상속되어 응용 프로그램에 필요한 콘크리트 도구를 제공합니다. 특정 도구가 선택되면 해당 도구 객체를 인스턴스화하고 어딘가에 기억하십시오. Window는 마우스 이벤트를 현재 활성 도구 객체로 전달한 다음 선택된 도구에 적절한 작업을 수행합니다.

이것은 Johannes가 언급하는 상태 패턴의 구현입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top