相关疑难解决方法(0)

我什么时候应该使用访客设计模式?

我一直在博客中看到对访客模式的引用,但我必须承认,我只是不明白.我阅读了维基百科文章的模式,我理解它的机制,但我仍然对我何时使用它感到困惑.

作为最近刚刚获得装饰模式的人,现在看到它在任何地方的用途我都希望能够直观地理解这个看似方便的模式.

design-patterns visitor-pattern

308
推荐指数
14
解决办法
10万
查看次数

设计模式:工厂与工厂方法与抽象工厂

我正在从网站上阅读设计模式

在那里我读到了有关工厂,工厂方法和抽象工厂的信息,但它们很混乱,我对定义并不清楚.根据定义

Factory - 创建对象而不将实例化逻辑暴露给客户端,并通过公共接口引用新创建的对象.是Factory Method的简化版本

工厂方法 - 定义用于创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象.

抽象工厂 - 提供用于创建相关对象族的界面,而无需明确指定其类.

我还查看了关于抽象工厂与工厂方法的其他stackoverflow线程,但是那里绘制的UML图使我的理解更加糟糕.

有谁能告诉我

  1. 这三种模式如何相互不同?
  2. 什么时候用哪个?
  3. 如果可能的话,任何与这些模式相关的java示例?

java language-agnostic design-patterns factory factory-method

164
推荐指数
6
解决办法
8万
查看次数

何时使用if-else if-else over switch语句,反之亦然

为什么要switch在一系列if语句中使用块?

switch 语句似乎做同样的事情,但需要更长的时间来输入.

switch-statement

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

在Java中创建一个不依赖于if-else的工厂方法

目前我有一个基于给定String充当工厂的方法.例如:

public Animal createAnimal(String action)
{
    if (action.equals("Meow"))
    {
        return new Cat();
    }
    else if (action.equals("Woof"))
    {
        return new Dog();
    }

    ...
    etc.
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是在类列表增长时避免整个if-else问题.我想我需要有两个方法,一个将字符串注册到类,另一个根据操作的字符串返回类.

在Java中这样做的好方法是什么?

java string factory

38
推荐指数
5
解决办法
2万
查看次数

用多态替换条件

我试图用一个例子来理解这个干净的代码实践.考虑具有折扣开关案例的类产品.我试图用多态替换switch语句.

代码之前:

class Product {
    String priceCode;
    int discount;

    Product(String priceCode) {
        setDiscount(priceCode);
    }

    public int getDiscount() {
        return discount;
    }

    public void setDiscount(String priceCode) {
        switch (priceCode) {
            case "CODE1":
                discount = // some logic;
            case "CODE2":
                discount = // some other logic;
            case "CODE3":
                discount = // some other logic;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在下面的代码中你可以看到我删除了switch语句但是我仍然有条件来创建discountStrategy的对象.我的问题是,我仍然有条件,我试图删除多态性.

代码后:

class Product {
    String priceCode;
    DiscountStrategy discountStrategy;

    Product(String priceCode) {
        setDiscount(priceCode);
    }

    public int getDiscount() {
        return discountStrategy.getDiscount();
    }

    public void setDiscount(String priceCode) …
Run Code Online (Sandbox Code Playgroud)

java polymorphism design-patterns

16
推荐指数
1
解决办法
3518
查看次数

Java中Switch Case的替代方案

有没有其他方法可以在Java中实现一个switch case,而不是看起来不好看的else.根据选择相应的方法,必须执行一组值组合.

java conditional-statements

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

Python OO程序结构规划

我是OOP的初学者,我想创建一个包含三个类A,B和C的程序.该类的每个实例都由一组特征Achar1,Achar2等定义.

该程序应该创建包含A元素,B元素和C元素的用途,包括开始和结束日期.有A和B的子类,因此A的某些元素只能连接到B的某些元素.该程序的主要功能是列出A,B和C的元素及其属性,列表用途和建议新用途这样可以最大限度地减少类的实例,以避免重复.

我的第一直觉是使用三个词典A,B和C以及一个字典供用.这似乎直观,易于导入/导出到json或类似.我试图重写它来使用类,但是我看不出这样做的任何好处:迭代类的实例很难(?)它们基本上都是字典,因为这些数据不需要太多其他内容.

我究竟做错了什么?从字典切换到对象可以获得什么?

编辑:有问题的代码(基于字典)在这里.我尝试使其面向对象的第一个版本就在这里.

python oop project-planning data-structures

9
推荐指数
2
解决办法
1311
查看次数

从Android中的ArrayAdapter访问资源

我定义了一些资源,例如:

<color name="lightGrey">#FFCCCCCC</color>
<integer name="KEY_POSITION_ARM">2</integer>
Run Code Online (Sandbox Code Playgroud)

...我有一个ArrayAdapter向TextViews显示项目.我正在尝试使用以下代码访问值:

keyPosition = getResources().getInteger(R.integer.KEY_POSITION_ARM);
moduleDataView.setTextColor(getResources().getColor(R.color.darkgreen));
Run Code Online (Sandbox Code Playgroud)

...但是我得到的错误是"方法getResources()未定义类型ContinuityAdapter".(ContinuityAdapter扩展ArrayAdapter)

这有什么好办法吗?

谢谢

这是一个例子:

switch (currentModule.keyPosition) {
case activity.getResources().getInteger(R.integer.KEY_POSITION_ARM):
    moduleDataView.keyPosition.setText("TEST");
    moduleDataView.keyPosition.setTextColor(Color.GREEN);
    break;
case R.integer.KEY_POSITION_ARM:
    moduleDataView.keyPosition.setText("ARM");
    moduleDataView.keyPosition.setTextColor(Color.RED);
    break;
}
Run Code Online (Sandbox Code Playgroud)

第一种情况给出错误,第二种情况不会,但也不使用XML文件中的值.虽然正如你所说,我可以只使用R ...值,只要我在任何地方使用它.只是不确定这是否被认为是"最佳实践".谢谢

java android android-arrayadapter

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

C++:switch语句中的struct成员

我正在用C++编写一个微处理器模拟器,我的目标之一是使代码非常易读.为了实现操作码,我有一个结构,我用它来表示单独的处理器指令,它包含操作码和程序计数器的推进程度.我们的想法是将有关每条指令的相关信息分组.

struct instruction
{
    const int opcode; // instruction opcode
    const int op_size; // how far to advance Program Counter
};

const instruction HALT{0x76, 1};
const instruction NOP {0x00, 1};
Run Code Online (Sandbox Code Playgroud)

我最初的计划是使用这个结构来定义所有的操作码,因为我认为const它更适合#define用于C++常量.此外,我将能够干净地分组操作码的所有相关属性.

但是,似乎这对于switch语句不起作用,正如我最初的意图.以下代码将无法编译,Visual Studio将提供错误"case expression not constant".

switch (next_instruction) { // next_instruction is an int parsed from a file
    case HALT.opcode:
        // do stuff
        break;
    case NOP.opcode:
        // do stuff
        break;
    default:
        std::cout << "Unrecognized opcode" << std::endl;
            break;
    }
Run Code Online (Sandbox Code Playgroud)

我还下载了最新的Visual Studio编译器(MSVC 2013年11月CTP)以尝试利用constexprC++ 11,但我遇到了同样的问题,并且它无法编译.在这里,我将我的结构转换为一个类并尝试利用constexpr …

c++ struct visual-c++ constexpr c++11

8
推荐指数
2
解决办法
3581
查看次数

有人可以推荐一个java 8模式来替换switch语句吗?

我有以下代码:

 public class A {
    private String type;
    String getType() { return type;}
 }
Run Code Online (Sandbox Code Playgroud)

现在在许多代码处我都有这样的代码

 switch (a.geType()) {
  case "A" : return new Bla();
  case "B" : return new Cop();
 }
Run Code Online (Sandbox Code Playgroud)

或者别的地方

switch (a.geType()) {
  case "A" : return new Coda();
  case "B" : return new Man();
 }
Run Code Online (Sandbox Code Playgroud)

(请注意,我知道我应该在生产代码中使用Enumeration).

我想要实现的是,当一个新类型添加到A类时,编译器应该标记所有需要调整的switch语句?

有没有java惯用的方法来做到这一点?

java design-patterns java-8

8
推荐指数
3
解决办法
7955
查看次数