gpt4 book ai didi

java - 面向对象 : new class implementing requires additional parameter

转载 作者:搜寻专家 更新时间:2023-11-01 02:56:52 25 4
gpt4 key购买 nike

假设我有一个如下所示的界面

public interface ConditionChecker {
boolean isInCondition(Person p);
}

我想创建一个实现上述接口(interface)的新类,但我需要用另一个参数实现一个函数

public class MacroConditionChecker implements ConditionChecker {
public boolean isInCondition(Person p, MacroView mv);
}

两个问题:
一:如果我将接口(interface)签名更改为 boolean isInCondition(Person p, MacroView mv);,那么我需要更新所有实现 ConditionChecker 的类
二:我希望 ConditionChecker 的消费者按原样调用 isInCondition

我认为这意味着:

public class MacroConditionChecker implements ConditionChecker {
private static final MacroView mv;
public MacroConditionChecker(MacroView mv) {
this.mv = mv;
}
public boolean isInCondition(Person p){
// now i have access to MacroView
}
}

所以,我唯一需要做的更改是在我决定使用 MacroConditionChecker 时进行更改,并且对 isInCondition 的调用没有更改

我在正确的轨道上吗?还是有其他方法可以做到这一点?

或者我应该将 MacroView 分离出来作为它自己的界面

public class MacroConditionChecker implements ConditionChecker implements MacroView

最佳答案

ConditionChecker 提醒Command design pattern .来自链接页面的评论:

Command decouples the object that invokes the operation from the one that knows how to perform it. To achieve this separation, the designer creates an abstract base class that maps a receiver (an object) with an action (a pointer to a member function). The base class contains an execute() method that simply calls the action on the receiver.

这正是您所需要的。如果您只需要检查 Person 对象的内部状态就足够了。当您想使用外部 API 检查 Person 对象时,可以创建在构造函数中将外部 APIPerson 绑定(bind)的实现> 方法中的对象。简单示例:

import java.util.ArrayList;
import java.util.List;

public class DesignPatterns {

public static void main(String[] args) {
List<ConditionChecker> checkers = new ArrayList<>();
checkers.add(person -> person != null);
checkers.add(person -> person.getName() != null);
checkers.add(person -> person.getName().length() > 0);
checkers.add(new MacroViewConditionChecker(new MacroView()));
checkers.add(new RestApiConditionChecker(new RestApi()));

Person person = new Person();
person.setName("Name");

for (ConditionChecker checker : checkers) {
System.out.println(checker.isInCondition(person));
}
}
}

interface ConditionChecker {

boolean isInCondition(Person person);
}

class MacroViewConditionChecker implements ConditionChecker {

private final MacroView macroView;

public MacroViewConditionChecker(MacroView macroView) {
this.macroView = macroView;
}

@Override
public boolean isInCondition(Person person) {
return macroView != null;
}
}

class MacroView {
}

class RestApiConditionChecker implements ConditionChecker {

private final RestApi restApi;

public RestApiConditionChecker(RestApi restApi) {
this.restApi = restApi;
}

@Override
public boolean isInCondition(Person person) {
return restApi.checkName(person.getName());
}
}

class RestApi {

public boolean checkName(String name) {
System.out.println("Validate name ...");
System.out.println(name + " is valid");

return true;
}
}

class Person {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

您可以将此模式与 Chain of Responsibility 一起使用.此方法不会将 Person 对象与任何实现绑定(bind)。此绑定(bind)在特定的 ConditionChecker 实现中完成,可以轻松交换。

关于java - 面向对象 : new class implementing requires additional parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55305902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com