有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (6) 个答案

  1. # 1 楼答案

    Visitor适用于当你有一个类家族,你需要为该家族中的每个类添加新功能,但不涉及类本身(或希望在一个地方定义新功能——Visitor)时

    策略适用于当您有一系列类需要能够执行某些操作才能正常工作(例如对它们包含的某些对象进行排序)但您希望客户机或依赖注入告诉他们如何执行该操作时

  2. # 2 楼答案

    访客模式意图:

    Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

    如果:

    1. 类似的操作必须在结构中分组的不同类型的对象上执行
    2. 您需要执行许多不同且不相关的操作它将操作与对象结构分离
    3. 必须添加新操作,而不改变对象结构
    4. 将相关操作收集到一个类中,而不是强制更改或派生类
    5. 向没有源代码或无法更改源代码的类库中添加函数

    尽管访问者模式提供了在不更改对象中现有代码的情况下添加新操作的灵活性,但这种灵活性也有一个缺点

    如果添加了新的可访问对象,则需要在Visitor&;参观课程。解决这个问题有一个变通方法:使用反射,这将对性能产生影响

    有关更多详细信息,请参阅oodesign articlesourcemaking文章

    战略模式意图:

    Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from the clients that use it.

    策略可以让你改变一个物体的内脏

    有关更多详细信息,请参阅以下问题:

    Real World Example of the Strategy Pattern

  3. # 3 楼答案

    主要区别在于策略模式封装了一组相关行为,而访客模式封装了多个这样的组

    • 当你需要封装一个行为时,你应该使用策略模式——如果你有一系列算法,并且需要在运行时从中进行选择,你应该使用策略模式。这是很常见的:每次你program to an interface的时候都会发生
    • 如果有一组算法需要与多个对象相关,则应使用访客模式来实现双重分派。这种情况不太常见,部分原因是它更难实现
  4. # 4 楼答案

    想象一下,你正在构建一个收银机应用程序,该应用程序正在生成收据。假设你想:
    1.确保不同种类的物品(书籍、水果、肉类、化妆品等)的处理方式不同
    2.将价格的实际计算逻辑与项目定义分开
    3.确保如果商店开始销售全新的东西(比如按长度收费的布料),你不需要更改太多代码

    Visitor可以是一个类,它根据正在处理的项目类型定义不同类型的计算。这是一项将价格计算中的差异从商品层次结构中移除的服务
    enter image description here

    其中getPrice的主体可以如下所示:

    getPrice(Calculation c) {
        return c.calculate(this);  // <-- visitor.visit( specific implementation )
    }
    

    在说ShoppingCart时,你将做:

    calc = getPriceCalculator()
    foreach item in items:
        totalPrice += item.getPrice(calc)
    

    想象一下这样的场景:在黑色星期五,你想做一些疯狂的折扣,所有书籍七折,所有水果五折。你可以很容易地做一些事情:

    BlackFridayCalculator extends PriceCalculator {
        calculate(Book b) { return 0.3 * parent.calculate(b) }
        calculate(Fruit f) { return 0.5 * parent.calculate(f) }
    }
    
    // and in getPriceCalculator:
    return (black friday time) ? new BlackFridayCalculator() : new PriceCalculator();
    

    策略相反,可以有一个不同类型计算(策略)的层次结构,然后每个项目将定义应该使用哪个计算(策略)(“插入”)

    enter image description here

    现在有很多方法来定义哪个项目应该使用哪个计算。最简单的方法是给出Item方法getCalculator,让每个项目选择它需要的计算

    这可能没有那么动态——从某种意义上说,每个项目都需要一个预定义的计算器来使用。但是想想这个场景:店主决定菠萝和西瓜应该每件出售——我们可以很容易地让Fruit默认使用WeightCalculator,并创建一个子集水果,按数量出售

  5. # 5 楼答案

    除了上面提到的行为差异之外,我在一个项目中也经历了依赖关系和用例方面的差异,如下所示

    例如,访问者了解具体的类。因此,在向层次结构中添加新的具体类时,您可以更灵活地更改访问者代码。战略中没有这样的东西。在这种情况下,如果有方法只返回带有给定输入的一些输出,而不考虑上下文,那么策略就更合适了

    此外,访客模式还用于实现SOLID的SRP,以分离关注点

  6. # 6 楼答案

    Visitor模式用于遍历对象层次结构,并提供一些功能,如打印或报告等。我使用它提供了不同的格式(文本/HTML),通过编写多个访问者来打印对象层次结构,每种格式一个访问者。层次结构中的对象是visitables

    策略模式用于根据输入选择特定的逻辑路径。一个典型的例子是身份验证过滤器,根据AuthorizationHTTP头中的值,选择并运行不同的身份验证策略,如NTLM/congotiate/Basic。过滤器将保存对AuthenticationStrategy接口的引用,根据传入的请求,选择特定的身份验证策略并将其分配给该引用,随后的代码不需要知道所使用的确切策略