この人生において、人は穏やかな人、親切な人、唇に笑顔と幸せな心を持った人でなければなりません。時々、気性を手放してあなたの悪い気性に屈することができる人々は、彼らがあなたを恐れているからではなく、あなたよりも大切にする方法を知っているからです。
デザインパターンの学習、近い将来23のデザインパターンについてブログを書きますので、お楽しみに〜
—2021 / 1/11
定義
組み合わせモードは、部分全体モードとも呼ばれ、オブジェクトをツリー構造に結合して、「部分全体」の階層構造を表します。
使用するシーン
- 組織をトラバースする必要がある場合、または処理オブジェクトがツリー構造である場合は、結合モードを使用するのが適しています
- 高度な抽象化が必要です。「ノード」と「リーフ」に大きな違いがある場合は、組み合わせモードの使用はお勧めしません。
よくある間違い
組み合わせモードは、使用される組み合わせではなく、使用される集計です。
一般的な状況分析
学校があるとすると、学校が教師を管理し、教師が生徒を管理しますが、すべての教師と生徒をどのようにトラバースしますか?
多くの場合、次のようになります。
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)
:
ティーチングディレクタークラスが時間内に追加され、ティーチングディレクターが教師を管理できるようになり、多くのコードを処理せず、非常に便利で迅速に記述できたことがわかります。最後に、開閉の原則(延長のために開いて、変更のためにシャットダウンします)!
オリジナリティは簡単ではありません、あなたの好きなものは私にとってあなたの最大のサポートです、それをサポートしたいです〜