我一直在博客中看到对访客模式的引用,但我必须承认,我只是不明白.我阅读了维基百科文章的模式,我理解它的机制,但我仍然对我何时使用它感到困惑.
作为最近刚刚获得装饰模式的人,现在看到它在任何地方的用途我都希望能够直观地理解这个看似方便的模式.
我正在从网站上阅读设计模式
在那里我读到了有关工厂,工厂方法和抽象工厂的信息,但它们很混乱,我对定义并不清楚.根据定义
Factory - 创建对象而不将实例化逻辑暴露给客户端,并通过公共接口引用新创建的对象.是Factory Method的简化版本
工厂方法 - 定义用于创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象.
抽象工厂 - 提供用于创建相关对象族的界面,而无需明确指定其类.
我还查看了关于抽象工厂与工厂方法的其他stackoverflow线程,但是那里绘制的UML图使我的理解更加糟糕.
有谁能告诉我
java language-agnostic design-patterns factory factory-method
为什么要switch在一系列if语句中使用块?
switch 语句似乎做同样的事情,但需要更长的时间来输入.
目前我有一个基于给定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中这样做的好方法是什么?
我试图用一个例子来理解这个干净的代码实践.考虑具有折扣开关案例的类产品.我试图用多态替换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中实现一个switch case,而不是看起来不好看的else.根据选择相应的方法,必须执行一组值组合.
我是OOP的初学者,我想创建一个包含三个类A,B和C的程序.该类的每个实例都由一组特征Achar1,Achar2等定义.
该程序应该创建包含A元素,B元素和C元素的用途,包括开始和结束日期.有A和B的子类,因此A的某些元素只能连接到B的某些元素.该程序的主要功能是列出A,B和C的元素及其属性,列表用途和建议新用途这样可以最大限度地减少类的实例,以避免重复.
我的第一直觉是使用三个词典A,B和C以及一个字典供用.这似乎直观,易于导入/导出到json或类似.我试图重写它来使用类,但是我看不出这样做的任何好处:迭代类的实例很难(?)它们基本上都是字典,因为这些数据不需要太多其他内容.
我究竟做错了什么?从字典切换到对象可以获得什么?
我定义了一些资源,例如:
<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 ...值,只要我在任何地方使用它.只是不确定这是否被认为是"最佳实践".谢谢
我正在用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 …
我有以下代码:
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惯用的方法来做到这一点?