Javaデザインパターンの組み合わせモード(9)

この人生において、人は穏やかな人、親切な人、唇に笑顔と幸せな心を持った人でなければなりません。時々、気性を手放してあなたの悪い気性に屈することができる人々は、彼らがあなたを恐れているからではなく、あなたよりも大切にする方法を知っているからです。

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

定義

組み合わせモードは、部分全体モードとも呼ばれ、オブジェクトをツリー構造に結合して、「部分全体」の階層構造を表します。

Baidu百科事典

使用するシーン

  • 組織をトラバースする必要がある場合、または処理オブジェクトがツリー構造である場合は、結合モードを使用するのが適しています
  • 高度な抽象化が必要です。「ノード」と「リーフ」に大きな違いがある場合は、組み合わせモードの使用はお勧めしません。

よくある間違い

組み合わせモードは、使用される組み合わせではなく、使用される集計です。

一般的な状況分析

学校があるとすると、学校が教師を管理し、教師が生徒を管理しますが、すべての教師と生徒をどのようにトラバースしますか?

多くの場合、次のようになります。

UML类图(1.1)


学校が教師を管理し、教師が生徒を管理し、多重継承のような関係を作ります

多重継承のデメリット:

  • 生徒を追加または削除するのは便利ではありません
  • カップリングが高すぎます、
  • 元のコードを変更する必要があります。これは、開閉の原則に違反します(拡張のために開く、変更のために閉じる)

組み合わせモード分析

UML类图(1.2)ここに画像の説明を挿入

分析:

  • 学生クラスは学校クラスを継承し、学校クラスは学生クラスから集約されます
  • 教師クラスは学校クラスを継承し、学校クラスは教師クラスから集約されます

役割分析:

  • Comonent:これは学校のクラスとして機能します(実装方法を標準化するために使用されます)
  • リーフ:リーフノード。ここでは、学生クラスが最下位であり、子ノードがないため、学生クラスを指します。
  • 複合:非リーフノード。複数の非リーフノードが存在する可能性があります。ここでは教師クラスを指し、非リーフノードの下に子ノードが存在する必要があります。

例えば:

  • インストラクター(非リーフノード)
  • クラス教師(非リーフノード)
  • クラス教師(非リーフノード)
  • 学生(リーフノード)

インストラクター>クラスティーチャー>クラスティーチャー>学生

大きな木のように、底は葉です

利点:

  • 強力な拡張性があります。新しいオブジェクトを追加する必要がある場合、元のコードを変更する必要はなく、開閉の原則(拡張のために開く、変更のために閉じる)に準拠します。
  • 複雑な階層構造を作成すると便利で、クライアントは細部に注意を払う必要がありません。

コード:

学校学校のクラス:

コードを標準化するために使用されます

public abstract class School {
    
    
   
    //名字
    private String name;
    //年级
    private  String grade;

   	//添加
    public void add(School school){
    
    
    }
    //删除
    public void remove(School school){
    
    
    }
    //输出日志
	abstract void print();

    public School(String name, String grade) {
    
    
        this.name = name;
        this.grade = grade;
    }
    get...
    set...
}

ここでadd()remove()メソッドが抽象として記述されていないのはなぜですか?

リーフノードを実装する必要がないため、誤解を招くことは避けてください。

先生:

public class Teacher extends School {
    
    

    List<School> mList = new ArrayList<>();

    public Teacher(String name, String grade) {
    
    
        super(name, grade);
    }

    @Override//输出日志
    void print() {
    
    
        Log.i("组合模式:", "========" + getName() + "========");
        for (int i = 0; i < mList.size(); i++) {
    
    
            mList.get(i).print();
        }
    }
    @Override
    public void add(School school) {
    
    
        mList.add(school);
    }
    @Override
    public void remove(School school) {
    
    
        mList.remove(school);
    }
}

学生クラス:

public class Student extends School {
    
    

    public Student(String name, String grade) {
    
    
        super(name, grade);
    }

    @Override
    void print() {
    
    
        Log.i("组合模式", "========== " + getName() + getGrade() + " ==========");
    }
}

テストコード:

Log.i("组合模式,","=======  振华中学  ======");

Teacher t1 = new Teacher("语文老师","一年级");
Teacher t2 = new Teacher("数学老师","二年级");
Teacher t3 = new Teacher("英语老师","三年级");
Teacher t4 = new Teacher("体育老师","四年级");

t1.add(new Student("小王","一年级"));
t1.add(new Student("小张","一年级"));
t1.add(new Student("小李","一年级"));

t2.add(new Student("小王","二年级"));
t2.add(new Student("小张","二年级"));
t2.add(new Student("小李","二年级"));

t1.print();
t2.print();
t3.print();
t4.print();

Log图(2.1)
ここに画像の説明を挿入
新しいノードを追加するにはどうすればよいですか?たとえば、ティーチングディレクターはクラスの教師を管理します。

インストラクターティーチングディレクタークラス:

public class Instructor extends School {
    
    
    private List<School> mlist = new ArrayList<>();

    public Instructor(String name, String grade) {
    
    
        super(name, grade);
    }

    @Override
    public void add(School school) {
    
    
        mlist.add(school);
    }

    @Override
    public void remove(School school) {
    
    
        mlist.remove(school);
    }

    @Override
    void print() {
    
    
        Log.i("组合模式", "----- " + getName() + getGrade() + "------");
        for (int i = 0; i < mlist.size(); i++) {
    
    
            mlist.get(i).print();
        }
    }
}

テストコード:

Log.i("组合模式,","=======  振华中学  ======");

Teacher t1 = new Teacher("语文老师","一年级");
Teacher t2 = new Teacher("数学老师","二年级");
Teacher t3 = new Teacher("英语老师","三年级");
Teacher t4 = new Teacher("体育老师","四年级");

t1.add(new Student("小王","一年级"));
t1.add(new Student("小张","一年级"));
t1.add(new Student("小李","一年级"));

t2.add(new Student("小王","二年级"));
t2.add(new Student("小张","二年级"));
t2.add(new Student("小李","二年级"));


Instructor instructor1 = new Instructor("王教导主任", "");
instructor1.add(t1);
instructor1.add(t2);

Instructor instructor2 = new Instructor("张教导主任", "");
instructor2.add(t3);
instructor2.add(t4);

instructor1.print();
instructor2.print();

Log图(2.2)ここに画像の説明を挿入
ティーチングディレクタークラスが時間内に追加され、ティーチングディレクターが教師を管理できるようになり、多くのコードを処理せず、非常に便利で迅速に記述できたことがわかります。最後に、開閉の原則(延長のために開いて、変更のためにシャットダウンします)!

完全なコード

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

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

おすすめ

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