相关疑难解决方法(0)

消除代码切换的方法

有什么方法可以消除代码中交换机的使用?

design-patterns

170
推荐指数
9
解决办法
12万
查看次数

Rank2Types的目的是什么?

我对Haskell并不十分精通,所以这可能是一个非常简单的问题.

Rank2Types解决了什么语言限制?Haskell中的函数是否已经支持多态参数?

polymorphism haskell types higher-rank-types

106
推荐指数
5
解决办法
1万
查看次数

访客模式的目的与示例

我对访客模式及其用途感到困惑.我似乎无法想象使用这种模式或其目的的好处.如果有人可以用例子解释,如果可能的话会很好.

java design-patterns visitor

83
推荐指数
3
解决办法
3万
查看次数

何时使用装饰器模式?

我正在研究我的设计模式,我在编码中尚未认真使用的一种模式是装饰模式.

我理解这种模式,但我想知道的是现实世界中一些具体的例子,装饰者模式是最佳/最佳/优雅的解决方案.需要装饰器模式的特定情况非常方便.

谢谢.

design-patterns decorator

58
推荐指数
5
解决办法
3万
查看次数

用于IO的GoF Decorator模式的用例和示例

我在维基百科中读到,Decorator模式用于.NetJava IO类.

任何人都能解释一下这是如何使用的吗?它有一个可能的例子,它有什么好处?

维基百科上有一个Windows窗体的例子,但我想知道Java IO类是如何发生的.

.net java io design-patterns decorator

54
推荐指数
5
解决办法
4万
查看次数

如何在实施工厂设计模式时避免"instanceof"?

我正在尝试实现我的第一个工厂设计模式,我不确定在将工厂制造的对象添加到列表时如何避免使用instanceof.这就是我想要做的:

for (ABluePrint bp : bluePrints) {
    AVehicle v = AVehicleFactory.buildVehicle(bp);
    allVehicles.add(v);

    // Can I accomplish this without using 'instanceof'?
    if (v instanceof ACar) {
        cars.add((ACar) v);
    } else if (v instanceof ABoat) {
        boats.add((ABoat) v);
    } else if (v instanceof APlane) {
        planes.add((APlane) v);
    }
}
Run Code Online (Sandbox Code Playgroud)

从我在SO上看到的,使用'instanceof'是代码气味.有没有更好的方法来检查工厂创建的车辆类型而不使用'instanceof'?

我欢迎任何关于我的实施的反馈/建议,因为我不确定我是否正确地采用了这种方式.

完整示例如下:

import java.util.ArrayList;

class VehicleManager {

    public static void main(String[] args) {

        ArrayList<ABluePrint> bluePrints = new ArrayList<ABluePrint>();
        ArrayList<AVehicle> allVehicles = new ArrayList<AVehicle>();
        ArrayList<ACar> cars = new ArrayList<ACar>();
        ArrayList<ABoat> boats = new …
Run Code Online (Sandbox Code Playgroud)

java design-patterns factory instanceof factory-pattern

37
推荐指数
1
解决办法
2万
查看次数

这种"instanceof"运算符的使用是否被认为是错误的设计?

在我的一个项目中,我有两个"数据传输对象"RecordType1和RecordType2,它们继承自RecordType的抽象类.

我希望两个RecordType对象在"process"方法中由同一个RecordProcessor类处理.我的第一个想法是创建一个通用的流程方法,该方法委托给两个特定的流程方法,如下所示:

public RecordType process(RecordType record){

    if (record instanceof RecordType1)
        return process((RecordType1) record);
    else if (record instanceof RecordType2)
        return process((RecordType2) record);

    throw new IllegalArgumentException(record);
}

public RecordType1 process(RecordType1 record){
    // Specific processing for Record Type 1
}

public RecordType2 process(RecordType2 record){
    // Specific processing for Record Type 2
}
Run Code Online (Sandbox Code Playgroud)

我读过Scott Meyers在Effective C++中写了以下内容:

"任何时候你发现你自己编写的形式的代码'如果对象是T1类型,那么做一些事情,但如果它是T2类型,那么做一些其他的事情,'打自己."

如果他是对的,显然我应该打自己.我真的没有看到这是多么糟糕的设计(除非当然有人将RecordType子类化并添加到RecordType3而不向处理它的通用"Process"方法添加另一行,从而创建一个NPE),以及我能想到的替代方案涉及将特定处理逻辑首当其冲地放在RecordType类本身中,这对我来说真的没有多大意义,因为理论上我可以对这些记录执行许多不同类型的处理.

有人可以解释为什么这可能被视为糟糕的设计并提供某种替代方案,仍然负责将这些记录处理到"处理"类?

更新:

  • 改变return nullthrow new IllegalArgumentException(record);
  • 简单来说,简单的RecordType.process()方法有三个原因是不够的:首先,处理实际上远离RecordType,在RecordType子类中应该拥有自己的方法.此外,理论上可以由不同的处理器执行大量不同类型的处理.最后,RecordType被设计为一个简单的DTO类,其中定义了最小的状态改变方法.

java design-patterns instanceof object-oriented-analysis

28
推荐指数
1
解决办法
7856
查看次数

为什么要使用访客模式?

重复:我应该何时使用访客设计模式

为什么有人想要使用访客模式?我读了几篇文章,但我没有得到什么.

如果我需要一个功能来收取定制,我可以使用

Custom.Accept(BillVisitor)
Run Code Online (Sandbox Code Playgroud)

或类似的东西

Bill(Customer)
Run Code Online (Sandbox Code Playgroud)

第二个不太复杂,Bill函数仍然与Customer类分开.那么我为什么要使用访客模式呢?

design-patterns visitor

27
推荐指数
2
解决办法
3万
查看次数

装饰设计模式与访客设计模式的区别

我相信了解Decorator和Visitor设计模式的意图.

虽然我可以列出以下差异

  1. Decorator在一个对象上工作,访问者在复合结构上工作,
  2. 装饰者是结构设计模式,访客是行为设计​​模式.

当我深入思考时,我无法说服自己两者之间的真正区别.

design-patterns decorator visitor

17
推荐指数
5
解决办法
9217
查看次数

策略,访问者和模板方法之间的区别是什么?

我正在上课,我们刚刚了解了这些设计模式.但是我看不出它们之间有什么区别.它们听起来像是一样的,在抽象的类上创建具体的类.有人可以帮我解决这个疑问吗?谢谢 (:

design-patterns strategy-pattern visitor template-method-pattern

15
推荐指数
1
解决办法
4324
查看次数