Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何在不改变其实现的情况下改变类的行为(哪种模式?)_Design Patterns - Fatal编程技术网

Design patterns 如何在不改变其实现的情况下改变类的行为(哪种模式?)

Design patterns 如何在不改变其实现的情况下改变类的行为(哪种模式?),design-patterns,Design Patterns,今天在采访中我被问到一个问题:如何在不改变其实现的情况下改变给定的类行为 我回顾了行为模式,但没有找到答案 我们在讨论模式、实体和IOC 我想这个问题与一些向现有类注入函数的机制有关。 我不认为它与扩展方法或仅仅是继承有关 例如,有一个类: OrdersService{ //some methods here } 我们需要在不改变实现的情况下,通过日志等扩展其行为。 也就是说,我们不应该这样做: OrdersService{ private ILogger _logger

今天在采访中我被问到一个问题:如何在不改变其实现的情况下改变给定的类行为

我回顾了行为模式,但没有找到答案

我们在讨论模式、实体和IOC

我想这个问题与一些向现有类注入函数的机制有关。 我不认为它与扩展方法或仅仅是继承有关

例如,有一个类:

OrdersService{
     //some methods here
}
我们需要在不改变实现的情况下,通过日志等扩展其行为。 也就是说,我们不应该这样做:

OrdersService{
     private ILogger _logger

     //some methods here
     OrdersService(ILogger logger)
    {
       _logger = logger;
    }     
}

也许面试官希望您建议创建另一个继承自该类的类,并用继承的类替换原始类

报告说:

可替换性是面向对象编程的一个原则。信息技术 声明,在计算机程序中,如果S是T的子类型,则 类型T的对象可替换为类型S的对象(即。, 类型S的对象可以替换类型T)的对象而不改变 该程序所需的任何属性(正确性、任务 表演等)

埃塔:看来,如果课程的原作者不想让你改变行为,你就不可能轻易做到。但是,如果它是使用依赖项注入正确创建的,则可以通过更改所注入类的标识来控制其行为的各个方面

如果
OrdersService
类采用某种类型的注入对象,例如
OrderRepository
,则可以创建一个
LoggingOrderRepository
,除了原始
OrderRepository
的任务之外,还执行日志记录。(将日志记录与数据访问合并并不是一个很好的实现想法,但它只是一个示例。)
Liskov替换原则
表示,
OrdersService
将能够处理
loggingordrepository
,就像它处理原始的
ordersrepository
一样


正如大卫·奥斯本(David Osborne)在回答中所指出的那样,还有一个问题。但是,这也要求类的原始作者希望您能够从要执行的一系列算法中进行选择。但是,正如您所说,这听起来与原始问题最为接近。

通过使用注入策略,您可以在不改变其实现的情况下改变类的行为。

我觉得这很像

…策略模式使用组合而不是继承。在策略模式中,行为被定义为单独的接口和实现这些接口的特定类。这允许在行为和使用行为的类之间更好地解耦可以在不破坏使用它的类的情况下更改行为,并且这些类可以通过更改所使用的特定实现在行为之间切换,而不需要任何重大的代码更改


确定你没有把问题弄错吗?只有通过更改实现才能更改行为。