OO:実装する新しいクラスが追加のパラメータが必要です

ealeon:

のは、私は以下のようにインターフェースを持っているとしましょう

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

私は上記のインタフェースを実装する新しいクラスを作成したいが、私は、他のパラメータを持つ関数を実装する必要があります

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

二つの問題:
ワン:私はインターフェイスの署名を変更した場合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
マイケルZiober:

ConditionChecker連想させるCommandデザインパターンをリンク先のページからのコメント:

このコマンドは、それを実行する方法を知っているものから操作を呼び出すオブジェクトを分離します。この分離を達成するために、設計者は、アクション(メンバ関数へのポインタ)とレシーバ(オブジェクト)をマッピングする抽象基底クラスを作成します。基本クラスは、単に受信機にアクションを呼び出すexecute()メソッドが含まれています。

これは、何が必要、正確です。ケースでは、唯一の内部状態を確認する必要がありPerson、それは十分にあるオブジェクトを。あなたがチェックしたい場合にはPerson、外部とのオブジェクトをAPIのOKが外部結合する実装を作成することAPIで、コンストラクタでPersonメソッド内のオブジェクト。簡単な例:

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;
    }
}

あなたは一緒にこのパターンを使用することができ責任のチェーンこのアプローチは結合しないPerson任意の実装を持つオブジェクト。このバインドは、特定の中で行われConditionChecker、容易に交換することができます実装。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=189641&siteId=1