デザイン パターン - 状態パターンの再考

1. 背景の紹介

最近、製品には、異なるアクティビティを異なる時間に表示するというビジネス要件があります (ここでは、アクティビティの実行時間ではなく、アクティビティの実行時間です)。この要件は、まだ N 種類のアクティビティによって拡張する必要があります。将来のアクティビティで、拡張を
達成する必要がある場合は、以前のアクティビティからいくつかのプロパティとメソッドを再利用します。

そういったニーズも相まって、ステートモードを改めて模索してみたら、俄然悟りを開いたので、まとめて共有しました。

2. アイデアと計画

  • 1. ステートモードの概要
  • 2. ステートモードのクラス図
  • 3. ステータスモードコード
  • 4. 状態モードを最適化できる場所
  • 5.最適化後のステートモードで実際の戦闘を投影

3. プロセス

1. ステートモードの概要

オブジェクトの内部状態が変化し、オブジェクトのクラスが変更されたように見えるときに、オブジェクトの動作を変更できるようにします。

2. ステートモードのクラス図

ここに画像の説明を挿入

3. ステータスモードコード

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:39
 */
public abstract class State {
    
    
    public abstract void Handle(Context context);
}

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:42
 */
public class ConcreteStateA extends State{
    
    
    @Override
    public void Handle(Context context) {
    
    
        context.setState(new ConcreteStateB());
    }
}

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:43
 */
public class ConcreteStateB extends State{
    
    

    @Override
    public void Handle(Context context) {
    
    
        context.setState(new ConcreteStateA());
    }
}

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:39
 */
public class Context {
    
    
    private State state;

    Context(State state){
    
    
        this.state = state;
    }

    public State getState() {
    
    
        return state;
    }

    public void setState(State state) {
    
    
        this.state = state;
        System.out.println("当前状态"+state.getClass().getName());
    }

    public void Request(){
    
    
        state.Handle(this);
    };
}

package com.a7DesignPattern.a3BehaviorType.a09State;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 10:44
 */
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Context context = new Context(new ConcreteStateA());
        context.Request();
        context.Request();
        context.Request();
        context.Request();
        context.Request();
    }
}

4. 状態モードを最適化できる場所

サブクラスの転送はサブクラス内でハードコーディングされているため、後続の新しいサブクラスが既存のサブクラスを変更する場合、オープンとクローズの原則に準拠しません。

5.最適化後のステートモードで実際の戦闘を投影

package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class ContentGrain {
    
    
    
    String name;

    private ContentGrain nextContentGrain;

    public String getName() {
    
    
        return name;
    }

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

    public ContentGrain getNextContentGrain() {
    
    
        return nextContentGrain;
    }

    public void setNextContentGrain(ContentGrain nextContentGrain) {
    
    
        this.nextContentGrain = nextContentGrain;
    }

    public void send(){
    
    
        System.out.println("当前对象所属的子类名字为:"+this.getClass().getName());
    }

}

package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Topic extends ContentGrain{
    
    

    public void dianzan(){
    
    
        System.out.println("我还有单独点赞的方法");
    }

    public void send(){
    
    
        super.send();
        dianzan();
    }
}

package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Practice extends ContentGrain{
    
    

    public void isOK(){
    
    
        System.out.println("这个活动是有标准答案的");
    }

    public void send(){
    
    
        super.send();
        isOK();
    }

}

package com.a7DesignPattern.a3BehaviorType.a09State.project;

import java.util.List;

public class RunLink {
    
    
    private static ContentGrain contentGrain;

    static {
    
    
        //这里的链将在配置文件中进行构建
        ContentGrain contentGrain1 = new Topic();
        contentGrain = contentGrain1;
        ContentGrain contentGrain2 = new Practice();
        contentGrain1.setNextContentGrain(contentGrain2);
        ContentGrain contentGrain3 = new Topic();
        contentGrain2.setNextContentGrain(contentGrain3);
    }

    public void run(){
    
    
       while (contentGrain.getNextContentGrain() != null){
    
    
           contentGrain.send();
           contentGrain = contentGrain.getNextContentGrain();
       }
    }

}

package com.a7DesignPattern.a3BehaviorType.a09State.project;

public class Client {
    
    
    public static void main(String[] args) {
    
    

        RunLink runLink = new RunLink();
        runLink.run();

    }
}

4. まとめ

1. ソフトウェア エンジニアリングを実装するためのデザイン パターンの原則と特定のパターンの適用の境界が明確になります。 2.
シーン内のパターンの魅力をより明確に理解できるようになります
。 3. デザイン パターンの種類を組み合わせて、シーンを理解して、より明確に解決される

五、昇華

認知力が上がったら振り返ってみると、デザインパターンの魅力と素晴らしさに改めて驚かされるでしょう。

おすすめ

転載: blog.csdn.net/u013030601/article/details/131884884