アーキテクチャ設計、Java 設計パターン 9、テンプレート メソッド パターンに関する記事

ここに画像の説明を挿入

1.テンプレートメソッドのパターン

テンプレート メソッド パターンは、それを実行するメソッドを定義する抽象クラスでテンプレートを公開します。そのサブクラスは必要に応じてメソッドの実装をオーバーライドできますが、呼び出しは抽象クラスで定義されたとおりに行われます。

簡単に言えば、操作のアルゴリズム スケルトンを定義し、サブクラスへのいくつかのステップの実装を遅らせて、サブクラスがアルゴリズムの構造を変更せずにアルゴリズムのいくつかのステップを再定義できるようにすることです。

第二に、テンプレートメソッドパターンの構造

抽象クラス WorkDay: テンプレート メソッド work() を定義します。これは、サブクラスの実装に延期されるいくつかの抽象メソッドを含む順次プロセスであるトップレベル ロジックのスケルトンを定義します。

サブクラスは、これらの抽象メソッド吃早饭eat()、早会earlyMeeting()、工作计划workPlan()、摸鱼fish()をオーバーライドして、スケルトン プロセスを具体的に実装します。

第三に、テンプレートメソッドパターンの長所と短所

1.利点

  1. テンプレート メソッド パターンは、定数の動作を親クラスに移動することで、サブクラス内のコードの重複を取り除きます。
  2. サブクラスは、アルゴリズムの拡張に役立つアルゴリズムの詳細を実装します。
  3. 親クラスを介してサブクラスによって実装された操作を呼び出し、サブクラス拡張を介して新しい動作を追加することは、「オープン/クローズの原則」に準拠しています。

2.短所

設計の習慣によると、抽象クラスは最も抽象的で一般的な属性とメソッドを宣言する責任があり、実装クラスは特定のトランザクション属性とメソッドを完了する責任がありますが、テンプレート メソッドは正反対です。サブクラスの実行は親クラスの結果に影響を与えるため、コードの読み取りが難しくなります。

第四に、テンプレートメソッドパターンの使用

1. 複数のサブクラスに共通のメソッドがあり、ロジックは基本的に同じです。

2. 重要で複雑なアルゴリズムについては、コア アルゴリズムをテンプレート メソッドとして設計し、その周囲の詳細な機能を各サブクラスで実装します。

3. リファクタリングの際、テンプレート メソッドは頻繁に使用されるメソッドであり、同じコードを親クラスに抽出し、コンストラクターを介してその動作を制限します。

5. テンプレート メソッド パターンを介して抽象クラス WorkDay を実装する

1. トップレベルの抽象クラス

package com.guor.template;

/**
 * 程序员的一天
 */
public abstract class WorkDay {
    
    

    String name;   // 姓名
    String job;  // 工作

    public WorkDay(String name, String job) {
    
    
        this.name = name;
        this.job = job;
    }

    final void work() {
    
    

        // 吃早餐
        eat();

        // 早会
        String workContent = earlyMeeting();

        // 根据早会内容制定工作计划
        boolean flag = workPlan(workContent);

        // 没有工作那就摸鱼喽
        if(true == flag){
    
    
            fish();
        }
    }

    /**
     * 吃早餐
     */
    abstract void eat();

    /**
     * 早会
     *
     * @return 工作内容
     */
    abstract String earlyMeeting();

    /**
     * 工作计划
     *
     * @param workContent 工作内容
     * @return 是否摸鱼
     */
    abstract boolean workPlan(String workContent);

    /**
     * 摸鱼
     */
    abstract void fish();
}

2. プロジェクト マネージャーの 1 日

package com.guor.template;

/**
 * 项目经理
 */
public class ProjectManager extends WorkDay{
    
    

    public ProjectManager(String name, String job) {
    
    
        super(name, job);
    }

    @Override
    void eat() {
    
    
        System.out.println(name + "哪有时间吃饭");
    }

    @Override
    String earlyMeeting() {
    
    
        System.out.println(name + "的早会内容 --> " + job);
        // 写周报、工作总结、项目计划书、投标文档...
        return job;
    }

    @Override
    boolean workPlan(String workContent) {
    
    
        System.out.println(name + "工作计划:一些细思极恐的工作细节");
        return true;
    }

    @Override
    void fish() {
    
    
        System.out.println(name + "摸鱼时光:哪有时间摸鱼,操");
    }
}

3. プログラマーの一日

package com.guor.template;

public class Programmer extends WorkDay {
    
    

    public Programmer(String name, String job) {
    
    
        super(name, job);
    }

    @Override
    void eat() {
    
    
        System.out.println(name + " --> 吃包子喝豆浆");
    }

    @Override
    String earlyMeeting() {
    
    
        System.out.println(name + "的早会内容 --> " + job);
        return job;
    }

    @Override
    boolean workPlan(String workContent) {
    
    
        if(job.equals(workContent)){
    
    
            System.out.println(name+"的工作计划 --> "+job);
            return true;
        }
        return false;
    }

    @Override
    void fish() {
    
    
        System.out.println(name + "的摸鱼时光:看哪吒博客");
    }
}

4. 彼女の日

package com.guor.template;

/**
 * 女朋友
 */
public class GirlFriends extends WorkDay{
    
    

    public GirlFriends(String name, String job) {
    
    
        super(name, job);
    }

    @Override
    void eat() {
    
    
        System.out.println(name + " -- 豆浆,糖酥藕片,丸子,干果仁,烤麻花,水果");
    }

    @Override
    String earlyMeeting() {
    
    
        // 只负责美,哪用开会
        System.out.println(name + "的早会内容 --> " + job);
        return "";
    }

    /**
     * 女朋友只负责美,没有工作
     */
    @Override
    boolean workPlan(String workContent) {
    
    
        System.out.println(name + "只负责美,没有工作");
        return true;
    }

    @Override
    void fish() {
    
    
        System.out.println(name + "每天除了摸鱼,还能干什么");
    }
}

5. テストクラス

public static void main(String[] args) {
    
    
    GirlFriends girlFriends = new GirlFriends("云韵","只负责美,没有工作");
    girlFriends.work();

    System.out.println("***********************");

    Programmer programmer = new Programmer("程序员","增删改查");
    programmer.work();

    System.out.println("***********************");

    ProjectManager projectManager = new ProjectManager("项目经理","写周报、工作总结、项目计划书、投标文档...");
    projectManager.work();
}

6. コンソール表示

ここに画像の説明を挿入

6. まとめ

上記のコードから、テンプレート メソッド パターンのコアが

  1. 抽象クラスを定義し、最終プロセスのスケルトン メソッドを定義し、いくつかの抽象メソッドを定義します。
  2. この抽象クラスを継承するサブクラスを定義し、その抽象メソッドを実際のビジネス ロジックに合わせて書き換えます。

サブクラスは特定の実行ロジックを気にする必要はありません。それらはすべて統一されたプロセスに従って実行されます。クラスの継承者は、特定のビジネス ロジックを気にするだけで済みます。

很多人觉得设计模式很简单,但是,能够熟练的将设计模式应用在自己的项目中,将各模块、功能规划的井井有条,运用的炉火纯青、恰到好处,真的很难。反复阅读,仔细体会。

デザイン パターン シリーズの記事:

Java 設計パターン 1、単一責任の原則

Java設計パターン2、開閉原理

Java 設計パターン 3、Liskov 置換原則

Java 設計パターン 4、見知らぬ人と話さない

Java 設計パターン 5、インターフェイス分離の原則

Java デザイン パターン 6、依存性逆転の原則

Java デザイン パターン 7、ファクトリ メソッド パターン

Java Design Pattern 8、チェック、承認プロセス改善アーティファクト、責任連鎖パターン

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/guorui_java/article/details/126374557