2013-10-22 2 views
0

나는 상상할 수있는 디자인 패턴을 찾고있다. 문제를 더 잘 설명하기 위해 예제를 설명하겠습니다.매트릭스와 같은 상속 패턴

주어진 (Linux) 시스템 패키지를 일반적인 방법으로 모델링하고 싶습니다. 기본 클래스는 Package이고 Apache2, PHP5 등과 같은 파생 상품입니다. 이제이 클래스에는이 패키지가 설치되고 구성되도록 모든 방법이 포함되어 있습니다. 하지만이 클래스는 데비안, 우분투, 페도라, CentOS, 다른 리눅스 배포판 및 (가능한 경우) Windows와 같은 여러 운영 체제에서 사용할 수 있어야합니다.

이 클래스는 기본 클래스에서 믹스를 비롯하여 효과적인 클래스가 상속 된 상속 매트릭스로 해결할 수있는 것처럼 보입니다. 기본 패키지 클래스에서 기초 메서드 및 믹스 인을 제공하여 메서드를 확장 및/또는 추가 할 수 있습니다. 클래스/모듈/인터페이스/프로토콜을 사용하여 결국 믹싱에 사용 된 특정 시스템에 자동 설치 기능을 제공합니다.

저는 이것을 루비로 만들려고합니다. 그러나 내가 더 흥미를 느끼기 위해서는 이것을 실현하기 위해 시스템에 적용 할 수있는 일반적인 디자인 패턴이 있습니다.

또한 기존 설계 패턴이나 원하는 것을 얻기위한 조합이 있다고 확신합니다.이 문제에 대한 내 자신의 해결책을 찾지 못한 것 같습니다.

추가 보너스 (또는 대안)이 문제는 객체 지향 접근 방식 대신 기능적 관점을 사용하여 해결하는 것이 더 쉽고 어떻게 보이는지 궁금합니다.

+0

제 의견으로는 이것이 상속이 아니라 구성에 좋은 사례입니다. – Rafa

답변

0

패키지가 스스로 설치하는 방법을 알아야하는지 또는 일반적인 설치 프로그램에 정보를 제공해야할지 여부는 문제입니다. 이것은 어떤 프로 시저가 가장 공통점이 있는지에 따라 두 플랫폼에 동일한 패키지를 설치하거나 같은 플랫폼에 두 패키지를 설치하는 방식에 따라 다릅니다.

두 경우 모두에서 나는 전략

사용 플랫폼이 때

  • 주어진 패키지가 수행해야하는 작업 (거의) 동일로 Strategy Pattern

    플랫폼 운영을 추천 할 것입니다

  • 동일한 플랫폼의 다른 패키지에는 설치 절차가 다릅니다.

각 패키지 클래스에 Platform 클래스를 제공하십시오. 이 클래스는 전략 패턴으로 제공하고, 플랫폼 사이에서 변화 작업, 예를 들어, 당신의 클래스를 제공합니다 :

(. 죄송 코드가 자바에 내가 :(루비를 모르는)

interface Platform { 
    File getInstallDir() 
} 

class PHP5 { 
    private Platform platform; 
    public PHP5(Platform platform) { 
    this.platform = platform 
    } 
    public void install() { 
    // Let the platform provide information 
    File destDir = platform.getInstallDir() 
    ... 
    } 
} 

또는 대안 :

interface Platform { 
    void copyPackageFiles(File[] files) 
} 

class PHP5 { 
    private Platform platform; 
    private File[] php5Files = ... 
    public PHP5(Platform platform) { 
    this.platform = platform 
    } 
    public void install() { 
    // Let the perform perform specific tasks 
    platform.copyPackageFiles(php5Files); 
    ... 
    } 
} 

이 방법은 두 가지의 가장 유연하지만 가장 가능성이 더 많은 상용구 코드를 작성하게됩니다.

패키지 전략

사용 등이 때 동일한 플랫폼에

  • 다른 패키지가 (거의) 동일한 설치 절차를 가지고있다. 주어진 패키지가 수행해야
  • 작업은 서로 다른 플랫폼간에

이 그냥 반대로 다른 패턴과 매우 유사하다. 이 경우 Package을 전략으로 사용하고 설치 절차를 제어하는 ​​Platform으로 전달합니다.

interface Package { 
    File[] getFiles(); 
    Properties getProperties(); 
} 

class Ubuntu { 
    public installPackage(Package package) { 
    // Use the package to provide input for you operations: 
    copyFiles(package.getFiles()); 
    updateConfiguration(package.getProperties); 
    } 
} 

패키지를 전략으로 사용하면 패키지 클래스가 거의 게터가되지 않습니다. 반면에 주어진 플랫폼에 대한 엄격한 설치 절차를 따라야하므로 유연성이 떨어집니다.

관련 문제