1

これは実際には非常に基本的なものです。多分誰かが良い:)解決策を持ってくるでしょう。

IComponent などのインターフェイスを用意します。

public interface IComponent {
    string GetStatus();
}

のいくつかの実装では、現在の時刻が午前 12 時から午前 12 時 10 分の間にある場合、IComponentのロジックの一部をスキップする必要があります。しかし、時間間隔をまったく気にしないGetStatus()他の実装があります。IComponent

つまり、次のように言えます。

public interface MyComponent : IComponent {
    public string GetStatus() {
        StringBuilder result = ...;
        ....
        if (/*current time between 12:00AM and 12:10AM */)
            result.Append("good enough");
        else {
            //calculate result
            result.Append(/*calculated result*/);
        }
        ...
        return result.ToString();
    }
}

したがって、基本的に必要なのはカプセル化です

if (/*current time between 12:00AM and 12:10AM */)
        return "good enough";

いくつかのクラスに、それをまたはsmthと呼びましょう。必要な'SomeBehavior'実装全体で再利用できます。 IComponent

それが役立つ場合、この条件の意味ifは「stat ファイルのチェックをスキップする」ことなので、SkipStatFilesCheckBehavior などの名前を付けることができます。

名前についてもよくわかりませんが、それが私がここにいる理由です (「動作」よりも適切な名前を付けることができます)。それを実装する最良の方法は何ですか?どのように「動作」をより適切に実装に注入できますIComponentか (たとえば、コンストラクターなどを介して)? 将来、他の「動作」が必要になった場合、ソリューションは拡張可能ですか? 将来的には、ある種の「振る舞い」でIComponent-implementation への参照が必要になるかもしれません。

4

3 に答える 3

0

プロキシパターンを使用します。私があなたの場合に理解している限り、あなたはそれをこのように使うことができます:

// common interface
public class IComponent {
    // I split getStatus, because both concrete cases have
    // common pre and post processings
    public string GetStatus() {
        StringBuilder result = ...;
        preProcess(result);
        mainProcess(result);
        postProcess(result);
        return result.ToString();
    }
    private void preProcess(StringBuilder str);
    private void postProcess(StringBuilder str);
    // proxied method
    private void mainProcess(StringBuilder str);
}

// class implementing the basic behavior
public class MyComponent : IComponent {
    private void mainProcess(StringBuilder result) {
        result.Append(/*calculated result*/);
    }
}

// proxy class that calls the basic behavior under certain conditions only
public class SkipStatFilesCheckBehavior : IComponent {
    IComponent basicBehavior;

    public SkipStatFilesCheckBehavior(IComponent newBasicBehavior) {
        basicBehavior = newBasicBehavior;
    }

    private void mainProcess(StringBuilder result) {
        if (/*current time between 12:00AM and 12:10AM */)
            result.Append("good enough");
        else { 
            basicBehavior.mainProcess(result);
        }
    }
}
于 2013-03-23T22:28:17.807 に答える
0

継承を使用して回答を投稿しましたが、コメントで継承を使用したくないと言っていました。構成例は次のとおりです。

public class Status 
{
    virtual public string getStatus()
    {
        StringBuilder result = new StringBuilder();
        if (1 == 1) //This IF statement will compare the time
            result.Append("good enough");
        else
        {
            //calculate result
            result.Append("calculated result");
        }
        return result.ToString();
    }
}

public class Component1 : IComponent
{
    public string getStatus()
    {
        Status component = new Status();
        String Status = component.getStatus();
        //Do the rest of the getStatus specific to Component1
        return Status;
    }
}

public class Component2 : IComponent
{
    public string getStatus()
    {
        String Status = "";
        //Do the rest of the getStatus specific to Component2
        return Status;
    }
}
public interface IComponent
{
    public string getStatus();
} 

上記のコードでは、Component1 には「a」ステータスがありますが、component 2 にはありません。Status クラスからサブクラスを作成して、getStatus() の動作を拡張できます。

于 2013-03-22T19:37:55.090 に答える
0

多分このようなもの:

interface Component {
    String status();
}
abstract class ComponentABC implements Component {
    ComponentABC() {
        this(false,false);
    }
    ComponentABC(boolean behaviour1,boolean behaviour2) {
        this.behaviour1=behaviour1;
        this.behaviour2=behaviour2;
    }
    public String status() {
        String s="component";
        if(behaviour1)
            s+=" with behaviour1";
        if(behaviour2)
            s+=" with behaviour2";
        return s;
    }
    boolean behaviour1,behaviour2;
}
class BasicComponent extends ComponentABC {}
class Behaviour1Component extends ComponentABC {
    Behaviour1Component() {
        super(true,false);
    }
}
class Behaviour2Component extends ComponentABC {
    Behaviour2Component() {
        super(false,true);
    }
}
class BehaviourBothComponent extends ComponentABC {
    BehaviourBothComponent() {
        super(true,true);
    }
}
public class So15578113 {
    public static void main(String[] args) {
        Component[] components=new Component[]{new BasicComponent(),new Behaviour1Component(),new Behaviour2Component(),new BehaviourBothComponent()};
        for(Component component:components)
            System.out.println(component.status());

    }
}
于 2013-03-22T23:27:32.233 に答える