2017-05-24 14 views
0

난 그냥, 부하, 스프레드 시트 작성과 관련된 모든 기능을 처리 저장하는 하나의 스프레드 시트 클래스를 사용하려면, 쓰기 등 현재 내가 스프레드 시트를 생성하는 하나의 오픈 소스 라이브러리 phpspreadsheet을 사용하고다른 라이브러리에서 스프레드 시트를 만들 때 사용하는 디자인 패턴은 무엇입니까? 내 컨트롤러 클래스에서

나중에 스프레드 시트를 만드는 또 다른 라이브러리로 바꾸고 싶다면 컨트롤러 클래스를 많이 변경하지 않고 Spreadsheetlib2와 같은 다른 클래스를 만들 수 있습니다. 그래서 어떤 디자인 패턴이 여기에서 사용하는 것이 더 낫습니다. "브리지"또는 어댑터?

// 내가 지금 시도하고있는 브리지 패턴.

interface SpreadsheetInterface { 

    public function create(); 

    public function write(); 

} 


class Spreadsheet extends AbstractSpreadsheet { 

    public function create() { 

    } 
} 



class PhpSpreadsheet implements SpreadsheetInterface { 

    public function create() { 

    } 
} 


abstract class AbstractSpreadsheet { 

    protected $spreadsheet; 

    protected function __construct(SpreadsheetInterface $spreadsheet) { 
     $this->spreadsheet = $spreadsheet; 
    } 
} 

답변

1

정말 "사용하는 어떤 패턴"에 그렇게 많은 관심을 지불 할 것입니다. 패턴은 코드를 작성하는 마법의 요리법이 아닙니다. 그것들은 단지 "속기 설명"일 뿐이며 이미 작성한 내용을 다른 개발자에게 설명하는 데 사용됩니다.

내가 할 수있는 방법은 컨트롤러가 의존하는 특정 인터페이스를 구현하는 래퍼 ("어댑터"라고 생각합니다)를 만드는 것입니다. 그리고이 래퍼에서 PhpSpreadsheet 인스턴스를 종속물로 전달하거나 해당 래퍼에서 직접 새 인스턴스를 만듭니다. 컨트롤러가 래퍼에 메서드를 호출

, 그것은 기본 "스프레드 시트 클래스에 대한 호출을 전달합니다. Heres는

0

교리가 Connection 인터페이스를 정의하는 데 사용하는 약간의 트릭, 동시에 PDO를 연장합니다.

interface Connection 
{ 
    public function prepare ($statement, array $driver_options = array()); 
} 

class PdoConnection extends \PDO implements Connection 
{ 

} 

그래서, 그들은 그들이에 연결 된 어떤 DB의 요구 사항을 기반으로 구현할 수있는 인터페이스를 정의하고 싶었다. 그러나 그들은 PDO 꽤 비슷한 API를 유지하고 싶었다, 그러나 PDO는 구현하지 않습니다 인터페이스를 확장하여을 확장하여 피기 백을해야했습니다. Connection을 구현하면서 PDO은 무의식적으로 Connection의 메서드를 구현합니다.

정말 똑같이 할 수 있습니다. 가장 좋아하는 스프레드 시트 라이브러리를 선택하고 해당 메소드에서 인터페이스를 만들고이를 확장 한 새로운 클래스를 만든 다음 인터페이스를 구현하십시오.

이제 구현을 전환하려면 좋아하는 라이브러리가 다른 버전을 구현하기 위해 상당한 양의 메소드 서명을 제공해야합니다.