Jav*_*per 18 java design-patterns
假设我想设计一个客户端需要以特定顺序调用函数的类,例如,
hasNext();
next();
Run Code Online (Sandbox Code Playgroud)
或者,作为一个非常通用的例子,一个CookFood带有方法的类:
class CookFood {
getListOfItems();
mixAllItems();
heat();
}
Run Code Online (Sandbox Code Playgroud)
在第二个例子中,我想强制说只有在获得物品后才能进行混合,并且只有在混合后才能进行加热.是否有任何已知的模式或良好实践来强制执行函数调用序列?
Jos*_*lor 31
您可能对Step Builder Pattern感兴趣.它并不一定适合您所呈现的所有情况,但其想法是每个操作都返回一些实现接口的东西,让您执行下一个操作.由于您只能通过以正确的顺序执行操作来获取对象,因此您将被迫以正确的顺序执行它们.
虽然在迭代(next/hasNext)情况下会感觉有点强迫,但你可以想象它
图案.不知何故,你得到一个CanWearSocks接口的实例,它只有以下方法.
CanWearShoes putOnSocks()
Run Code Online (Sandbox Code Playgroud)
当你打电话时putOnSocks(),你得到你的CanWearShoes实例,它只有以下方法.
SockAndShoeWearer putOnShoes()
Run Code Online (Sandbox Code Playgroud)
当你打电话给putOnShoes()你时,你现在有穿袜子和鞋子的东西,你被迫以正确的顺序进行.
特别好的是你可以在两种情况下实际使用相同的对象,但由于方法签名只返回接口类型,代码只能使用接口方法(除非代码是偷偷摸摸的,并将对象转换为不同类型).
这是一个实现迭代模式的相当人为的例子,即确保在NextGetter之前使用NextChecker.
public class StepBuilderIteration {
interface NextChecker {
NextGetter hasNext();
}
interface NextGetter {
Object next();
NextChecker more();
}
static class ArrayExample {
final static Integer[] ints = new Integer[] { 1, 2, 3, 4 };
public static NextChecker iterate() {
return iterate( 0 );
}
private static NextChecker iterate( final int i ) {
return new NextChecker() {
public NextGetter hasNext() {
if ( i < ints.length ) {
return new NextGetter() {
public Object next() {
return ints[i];
}
public NextChecker more() {
return iterate( i+1 );
}
};
}
else {
return null;
}
}
};
}
}
public static void main(String[] args) {
NextChecker nc = ArrayExample.iterate();
while (nc != null) {
NextGetter ng = nc.hasNext();
if (ng != null) {
System.out.println(ng.next());
nc = ng.more();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
如果您可以完全访问源代码并且可以修改它,那么什么阻止您使用工厂方法模式与模板方法模式的组合.一个简单的例子:
public class CookFood {
public Food MakeFood() {
PrepareFood();
HeatFood();
ServeFood();
}
protected abstract void PrepareFood();
protected abstract void HeatFood();
protected abstract ServeFood();
}
Run Code Online (Sandbox Code Playgroud)
现在代码的客户端可以调用MakeFood哪个将强制执行步骤顺序,如果要自定义任何步骤,则可以子类化CookFood并实现该特定步骤.当然,这些步骤PrepareFood(), HeatFood(), ServeFood()不一定是抽象的,您可以使用默认实现,您可以在子类中重写以进行自定义.
| 归档时间: |
|
| 查看次数: |
7121 次 |
| 最近记录: |