簡體   English   中英

策略模式和適配器的區別

[英]Difference between Strategy Pattern and Adapter

為什么策略設計模式和適配器是相互關聯的? 在我看來,適配器操縱某種方法的結果來滿足另一個人的輸入需求。 戰略先行於行為。

適配器模式基本上允許類在一起工作,因為不兼容的接口。 適配器將一個類的接口轉換為另一個類可能使用的接口。

與您出國旅行的方式類似,您需要攜帶電源適配器才能使用牆壁插座。

另一方面,策略模式采用一組算法,並使它們可互換(通過從公共接口擴展)。 因此,無論使用該策略的哪個類都可以輕松地將其與該組中的另一個策略互換。

換句話說,Adapter不會以任何方式添加行為,它只是修改現有接口以允許其他類訪問現有功能。

另一方面,策略模式封裝了不同的行為,並允許它們在運行時切換。

一個例子總是好的,讓我們看一個適配器的用例。 假設您正在使用一些無法修改的 package,它包含以下文件:

class DatabaseManager
{
   private Connection $connection;

   public function connect(Connection $connection)
   {
      $this->connection = $connection->establish();
   }
}

class MysqlConnection implements Connection
{
    public function establish(){
       // connect to mysql...
    }
}

在您的存儲庫中,您有以下代碼:

class YourService
{
   public function connectDB()
   {
      $db = new DatabaseManager();
      $db->connect(new MysqlConnection());
   }
}

一切正常,但是您需要更改與 SqlLiteConnection 的連接並添加必須導入不同的 package 才能使用它。 導入的文件如下所示:

class SqlLiteConnection
{
    public function prepareConnection(){
       // first prepare the connection...
       return $preparedConnection;
    }

    public function executeConnection($preparedConnection){
       // then connect ...
       $preparedConnection->execute();
    }
}

SqlLiteConnection 的接口(方法名)與 MysqlConnection 不同,所以你在使用時遇到了問題:

class YourService
{
   public function connectDB()
   {
      $db = new DatabaseManager();
      $db->connect(new SqlLiteConnection()); // error! method `establish` does not exist in SqlLiteConnection.
   }
}

您無法修改 SqlLiteConnection package,因此要使其正常工作,您需要創建一個適配器:

class SqlLiteAdapter implements Connection
{
   public function establish($sqlConnection)
   {
      $preparedConnection = $sqlConnection->prepareConnection();
      $sqlConnection->executeConnection(preparedConnection);
   }
}

現在它起作用了!

class YourService
{
   public function connectDB()
   {
      $db = new DatabaseManager();
      $db->connect(new SqlLiteAdapter(new SqlLiteConnection())); //works!
   }
}

如您所見,適配器只是用作 map establish別名,用於方法prepareConnectionexecuteConnection 這是適配器的目的,它不會添加功能,而只是根據您的需要adapts接口。 類似於允許您在歐盟插座中使用美國插頭的旅行適配器。

另一方面,策略模式將具有與上述類似的實現,但您不會只是 map 適配器中的某些功能,而是會為每個策略添加您獨特的邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM