プロジェクトのソースアドレスします。https://github.com/ggb2312/JavaNotes/tree/master/design-pattern(デザインパターン、関連するコードやメモ)
1.定義
ツリー構造内のオブジェクトを組み合わせることで、階層の「不可欠な部分」を表現するために
該当2.
- クライアントは、オブジェクトや個々のオブジェクトの違いの組み合わせをしたい場合は無視することができます
- ツリー構造を取り扱うとき
3.クラス図と役割
- コンポーネントは、すべてのクラスの合計インターフェイスのデフォルトの動作を実装する適切なインタフェースオブジェクトの宣言です。
- リーフは、リーフノードオブジェクトである、それは子ノードを持ちません。
- 複合体はブランチノードオブジェクトである、ツリー構造を形成するブランチノードとリーフノードの組み合わせを記憶する記憶手段。
4.関連するデザインパターン
複合モードとVisitorパターン
- 訪問者は、再帰構造を組み合わせモードアクセスモードを使用することができます。
例5モード
背景:ムーは、ディレクトリ構造のカリキュラム部門へのクラスのネットワーク
コンポーネントもちろん抽象クラス:
public abstract class CatalogComponent {
public void add(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不支持添加操作");
}
public void remove(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不支持删除操作");
}
public String getName(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不支持获取名称操作");
}
public double getPrice(CatalogComponent catalogComponent) {
throw new UnsupportedOperationException("不支持获取价格操作");
}
public void print() {
throw new UnsupportedOperationException("不支持打印操作");
}
}
リーフコースカテゴリ:
public class Course extends CatalogComponent{
private String name;
private double price;
public Course(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String getName(CatalogComponent catalogComponent) {
return this.name;
}
@Override
public double getPrice(CatalogComponent catalogComponent) {
return this.price;
}
@Override
public void print() {
System.out.println("Course Name :"+name+" price"+price);
}
}
複合ディレクトリカテゴリ:
public class CourseCatalog extends CatalogComponent {
private List<CatalogComponent> items = new ArrayList<>();
private String name;
private Integer level;
public CourseCatalog(String name, Integer level) {
this.name = name;
this.level = level;
}
@Override
public void add(CatalogComponent catalogComponent) {
items.add(catalogComponent);
}
@Override
public void remove(CatalogComponent catalogComponent) {
items.remove(catalogComponent);
}
@Override
public void print() {
System.out.println(this.name);
for (CatalogComponent catalogComponent : items) {
if (level != null) {
for (int i=0;i<level;i++){
System.out.print("-");
}
}
catalogComponent.print();
}
}
}
このクラス図では:
テストカテゴリ:
public class Test {
public static void main(String[] args) {
CatalogComponent linuxCourse = new Course("Linux课程", 11);
CatalogComponent windowsCourse = new Course("windows课程", 11);
CatalogComponent javaCourseCatalog = new CourseCatalog("Java课程目录",2);
CatalogComponent mmallCatalog1 = new Course("Java电商一期", 55);
CatalogComponent mmallCatalog2 = new Course("Java电商二期", 66);
CatalogComponent designPattern = new Course("Java设计模式", 77);
javaCourseCatalog.add(mmallCatalog1);
javaCourseCatalog.add(mmallCatalog2);
javaCourseCatalog.add(designPattern);
CatalogComponent imoocMainCourseCatalog = new CourseCatalog("网站课程主目录",1);
imoocMainCourseCatalog.add(linuxCourse);
imoocMainCourseCatalog.add(windowsCourse);
imoocMainCourseCatalog.add(javaCourseCatalog);
imoocMainCourseCatalog.print();
}
}
テスト結果:
6.長所と短所
利点:
- 明確オブジェクト階層のすべてまたは一部を表す複雑な階層オブジェクトを定義します
- クライアントは、レベルの違いを無視してみましょう、階層全体を制御することが容易
- クライアントコードを簡素化
- 開閉の原則に沿って、
短所:
- より複雑になるとき、制限タイプ
- デザインは、より抽象的になり
7.ソースコード及びフレーム拡張-JDK1.7組み合わせパターン
7.1 JDK
- java.awt.Containerの、コンポーネント
- Jawakutilkःashanap、
- java.util.ArrayListの、リスト、コレクション
7.2 MyBatisの
org.apache.ibatis.scripting.xmltags.SqlNode
MixedSqlNode同等CourseCatalogコースカタログ