繁体   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