Javaデザイナーパターンのビジターパターン(14)

Javaデザイナーパターンのビジターパターン①④

現実の生活はあなたの毎日の仕事の世話をすることです。あなたとは何の関係もない愛や見通しを求めないでください。不必要な感情や判断にこだわるな。妄想したり、それに夢中になったりしないでください。自分を傷つけたり、他人に敵対したりしないでください。演じたり、他人の演技を信じたりしないでください。

デザインパターンの学習、近い将来23のデザインパターンについてブログを書きますので、お楽しみに〜
—2021 / 1/17

定義

オブジェクト構造の各要素に作用する操作を表します。これにより、各要素のクラスを変更せずに、これらの要素に作用する新しい操作を定義できます。

Baidu百科事典

アプリケーションシナリオ

最終試験結果が発表されると仮定すると:

成績は次のように分けられます:中国語と数学
学生は次のように分けられます:Xiao Ming、Xiao Hong

従来の方法で科目を追加したり、学生を追加したりする場合は、元のコードを変更する必要があります。これは、オープンとクローズの原則(拡張のためにオープン、変更のためにクローズ)に違反します。これがビジターモードです。

UML类图(1.1)

ここに画像の説明を挿入

  • 赤いボックス:インタビュー対象者(スコア)

  • 黄色のボックス:訪問者(学生)

  • ObjectStructureは、成績と学生を集約します。電話をかけると、ObjectStructureを操作できます。

役割分析

  • Achievement():インタビュイーインターフェイス

  • Chinese()/ Mathematics():インタビュイーインターフェースの実装

  • Student():ビジターインターフェース

  • XiaoMing()/ XiaoHong():ビジターインターフェースの実装

  • ObjectStructure():構造オブジェクトの役割。これは、訪問者モデルを使用するために必要な役割です。次の特徴があります。要素を列挙できる、訪問者が要素にアクセスできるようにする高レベルのインターフェイスを提供できる、必要に応じて、複合オブジェクトまたはコレクション(リストや順序付けられていないコレクションなど)として設計できる)。

      我理解的ObjectStructure():避免访问者与被访问者直接交互,遵守迪米特原则
      (最少知道原则)
      
      迪米特原则定义之一:
      	一个类对自己依赖的类知道的越少越好,你的东西也别让我知道(不对外泄露信息)
    

コード

アチーブメントインターフェイス:

public interface Achievement {
    
    
    //分数
    void fraction();
}

中国語のスコア、スコアインターフェイスを実現します。

public class Chinese implements Achievement {
    
    
    //姓名
    private final String name;
    //分数
    private final double fraction;
    //传递姓名和分数 
    public Chinese(String name ,double fraction) {
    
    
        this.fraction = fraction;
        this.name = name;
    }
    @Override
    public void fraction() {
    
    
        Log.i("访问者模式",name+" 的语文成绩为 "+fraction+" 分");
    }
}

数学の数学のスコア、スコアインターフェイスを実現します。

public class Mathematics implements  Achievement {
    
    
    //姓名
    private final String name;
    //分数
    private final double fraction;

    public Mathematics(String name ,double fraction) {
    
    
        this.fraction = fraction;
        this.name = name;
    }
    @Override
    public void fraction() {
    
    
        Log.i("访问者模式",name+" 的数学成绩为 "+fraction+" 分");
    }
}

学生学生インターフェース、スコアインターフェースを集約します。

public interface Student {
    
    
    //具体学生
    void student(Achievement achievement);
}

XiaoMing Xiaoming、学生インターフェースを実装します。

public class XiaoMing implements Student {
    
    
    @Override
    public void student(Achievement achievement) {
    
    
        //小明成绩
        achievement.fraction();
    }
}

XiaoHong、学生インターフェースを実現します。

public class XiaoHong implements Student {
    
    

    @Override
    public void student(Achievement achievement) {
    
    
        achievement.fraction();
    }
}

ObjectStructure、構造化オブジェクトの役割(Dimitの原則に準拠):

public class ObjectStructure {
    
    
    /**
     *  //输出成绩
     * @param student 具体学生
     * @param achievement 具体要除数的分数
     */
    public void outputAchievement(Student student,Achievement achievement){
    
    
            student.student(achievement);
    }
}

テストコード(クライアント):

		 //小明
        XiaoMing xiaoMing = new XiaoMing();
        //小红
        XiaoHong xiaoHong = new XiaoHong();


        //小明语文成绩
        Chinese chinese1 = new Chinese("小明",67);

        //小红语文成绩
        Chinese chinese2 = new Chinese("小红",100);

        //小明数学成绩
        Mathematics mathematics = new Mathematics("小明",43);
		
		//结构对象角色
        ObjectStructure objectStructure = new ObjectStructure();

        xiaoMing.student(chinese1);
        objectStructure.outputAchievement(xiaoMing,chinese1);
        objectStructure.outputAchievement(xiaoHong,chinese2);
        objectStructure.outputAchievement(xiaoMing,mathematics);

Log图(2.1)
ここに画像の説明を挿入

拡張する方法

たとえば、XiaoZhangという名前のクラスメートである英語を追加する必要があります。

英語英語スコア、スコアインターフェイスを実現します。

public class English implements Achievement{
    
    
    //姓名
    private final String name;
    //分数
    private final double fraction;

    public English(String name ,double fraction) {
    
    
        this.fraction = fraction;
        this.name = name;
    }
    @Override
    public void fraction() {
    
    
        Log.i("访问者模式",name+" 的英语成绩为 "+fraction+" 分");
    }
}

XiaoZhangの学生、学生インターフェースを実装します。

public class XiaoZhang implements Student {
    
    

    @Override
    public void student(Achievement achievement) {
    
    
        achievement.fraction();
    }
}

テストコード(クライアント):

 //小张
XiaoZhang xiaoZhang = new XiaoZhang();
//英语成绩
 English english = new English("小张", 55);
 
ObjectStructure objectStructure = new ObjectStructure();

objectStructure.outputAchievement(xiaoZhang,english);

Log图(2.2)
ここに画像の説明を挿入
まとめ:

  • Dimitの原則に従います(直接の友人とのみ通信するほど、クラスが依存するクラスについての知識が少ないほど、情報が漏洩することはありません)これはObjectStructureを指します
  • 開閉の原則(拡張のために開く、変更のために閉じる)に準拠するここでは、英語とXiao Zhang拡張の追加、優れたスケーラビリティを指します
  • 単一責任の原則を遵守する:(1つのクラスが1つの責任を負うのではなく、1つのクラスが1つの責任を負う)、ここでは、学年/学生に対応する実装クラスを指します。

完全なコード

デザインモードのホームページ/デザイン原則に移動します

オリジナリティは簡単ではありません、あなたの好きなものは私にとってあなたの最大のサポートです〜

おすすめ

転載: blog.csdn.net/weixin_44819566/article/details/112746412