記事ディレクトリ
まとめ
6 つの関係のうち、弱いものから強いものへの順序は、依存関係、関連性、集合体、構成、継承、実現です。
関連は、クラス間の構造的な関係です。
その中で、集約と結合は特別な種類の関連付けであり、全体と部分の関係を表します。
クラス B のオブジェクトのみがクラス A のメソッドで使用される場合、クラス A はクラス B に依存します。
クラス A がクラス B のライフサイクルを制御する場合、クラス A とクラス B は複合的な関係にあります。
UML ダイアグラムでの 6 つの関係の線表現
依存関係と関連の違い
関係名 | 特定の関係 | 顕著な実施形態 |
---|---|---|
頼る | 利用関係(意味関係) | オブジェクト a はオブジェクト b のサービスのみを呼び出します |
仲間 | 構造関係 | オブジェクト a はオブジェクト b のインスタンスを取得し、サービスを呼び出すことができます |
クラス A の一方向関連がクラス B を指している場合、クラス A には属性 B b が存在します。つまり、クラス B はクラス A に属性として存在します。
クラス A がクラス B に依存している場合、この属性はありません. クラス B のインスタンスは、メソッド呼び出しのパラメーターまたはメソッドのローカル変数に存在する場合があります.
集計と構成の違い
関係名 | 特定の関係 | 顕著な実施形態 |
---|---|---|
重合 | 弱い構造的関係 (全体と部分) | 全体は存在せず、部分は存在する |
組み合わせ | 強い構造的関係(全体と部分) | 全体が存在しない、部分が存在しない |
継承と実装の違い
関係名 | 特定の関係 | 顕著な実施形態 |
---|---|---|
継承する | 一般と特殊 | 通常は同じモデル内のセマンティック層要素とリンクされます |
達成 | 意味関係 | 通常は異なるモデル内で、異なるセマンティック レイヤーの要素をリンクする |
1. 依存
コンセプト:依存関係は六大関係の中で最も弱い関係であり、弱いつながりです。これは2 つのものの間の意味的関係であり、使用関係です. 1 つのオブジェクトが別のオブジェクトのサービスを呼び出すだけで、1 つのもの (独立したもの) の変更が他のもの (依存するもの) に影響を与えることが明らかになります。セマンティクス。
具体的な実施例:
通常、クラス ライブラリの使用は撤退の 1 つです. たとえば、プログラムで sqrt() 平方根関数が呼び出され、クラス A でクラス B が使用されます。メソッド内のローカル変数. in A.
コードは次のように反映されます。
public class Clothes {
private String clothesName="大风衣";
public String getClothesName() {
return this.clothesName;
}
}
public class Food {
private String food="糖醋里脊";
public String getAceType() {
return this.food;
}
}
public class Person {
private String name;
public void showInfo(Food food,Clothes clothes) {
System.out.println(name+"穿"+clothes+"吃"+food);
}
}
UML 図面では、次のような破線の矢印です。
この例では、人間は衣服と食物に依存しています.衣服と食物がなければ、人々は食べたり着たりすることができず、衣服や食物の変化は人間の変化にも影響します.
二、協会
概念:関連付けは構造的な関係であり,オブジェクトのグループ間の一連の接続を記述します.一方向の関連付け, 双方向の関連付けと自己関連付け (1 つのクラスのみが関与する) があります. 複数の次数、役割名、および説明 関連付けをチェーンに追加できます オブジェクトの数とその動作など 関連関係には、部分と全体の間の構造的な関係を記述するために使用される、集計と構成という特別なタイプがあります。
具体的な実施例:
自己関連付け: 自己完結型
一方向の関連付け: クラス A は、クラス B がクラス A を知っている必要なく、クラス B を知っています。(クラス A の属性としてのクラス B)
コードの実施例:
public class Teacher {
private String tchName="小明";
public String getTchName() {
return this.tchName;
}
}
public class Student {
private String stuName;
Teacher xiaoMing=new Teacher();
public void showInfo() {
System.out.println(xiaoMing.getTchName()+"教了这位"+stuName+"同学");
}
}
UML ダイアグラムでは、以下に示すように、関連関係は実線の矢印で表されます。
この例では、一方通行の関連付け、生徒クラスが一方通行の教師のオブジェクトを新規作成し、このオブジェクトのメソッドを呼び出します。
双方向の関連付け: クラス A はクラス B について知る必要があり、クラス B はクラス A について知る必要があります。(クラスABはお互いの属性)
コードの実施例:
public class Student {
private String stuName="狗蛋";
Teacher xiaoMing=new Teacher();
public void showInfo() {
System.out.println(xiaoMing.getTchName()+"教了这位"+stuName+"同学");
}
public String getStuName() {
return this.stuName;
}
}
public class Teacher {
private String tchName="小明";
Student gd=new Student();
public String getTchName() {
return this.tchName;
}
public void showInfo() {
System.out.println("学生"+gd.getStuName()+"是我的学生");
}
}
この例では、双方向の関連付け、生徒クラスが教師のオブジェクトになり、教師クラスも生徒のオブジェクトになり、それぞれのメソッドが呼び出されます。
3. 重合
概念:集合体は、参照の集合 (参照の構成)として理解できます。全体は存在しませんが、部分は単独で存在できます。全体と部分の関係を反映します. 全体と部分は分離することができ, それぞれに独自のライフサイクルがあります. 部分は複数のオブジェクト全体に属することも, 複数のオブジェクト全体で共有することもできます. 集約は, サブタイプが親型が存在します。
具体的な実施例:
たとえば、生徒と教師がクラスを形成し、クラスが解散した後も、教師と生徒は独立して存在できます。クラスには生徒がいます。
同様に、従業員と部門、あなたとあなたの家族、メインボード上のコンポーネントとメインボードの関係などがあります。
コードの実施例:
public class Student {
private String stuName="狗蛋";
public String getStuName() {
return this.stuName;
}
}
public class Teacher {
private String tchName="小明";
public String getTchName() {
return this.tchName;
}
}
UML クラス図では、次の図に示すように、中抜きのひし形と矢印で表され、ひし形は全体を指しています。
この例では、クラスは全体であり、教師と生徒は部分です. クラスが存在しない場合でも、教師と生徒は独立して存在することができます.彼が在学中の 3 年生の先生はもうそこにいません。彼の先生の Xiao Ming も他のクラスを教えに行きました。
4.組み合わせ
考え方:組み合わせは、価値の集合(価値の総合)として捉えることができ、全体がなければ部分も存在しない。強い所有関係です。クラス A の一部はクラス B のオブジェクトで構成され、クラス A はクラス B のライフサイクルを制御します。コンポジションは、サブタイプがスーパータイプなしでは存在できないことを意味します。全体と部分の間には共生があります。
具体的な実施例:
ページと本との関係、手足と人の関係など、それらには包含関係があります。
コードの実施例:
public class Page {
private int pageNums=100;//页数
private String pageType="护眼纸张";//纸的类型
public int getPageNums() {
return pageNums;
}
public String getPageType() {
return pageType;
}
}
public class Book {
private String bookName="金刚经";
Page num1=new Page();
public void showBookInfo() {
System.out.println(bookName+"由"+num1.getPageNums()+"页的"
+num1.getPageType()+"型的纸类型构成");
}
}
UML クラス図では、次の図に示すように、実線のひし形と矢印で表され、ひし形は全体を指しています。
この例では、本はページと組み合わされており、ページは本から独立して存在することはできません。
5.継承
概念:一般化とも呼ばれる継承は、クラスとその 1 つ以上の洗練されたクラスとの関係、つまり、一般的なクラスと特殊なクラス間の関係です。特殊な要素 (子要素) のオブジェクトは、一般的な要素 (親要素) のオブジェクトを置き換えることができます[リスコフ置換] . このように、子要素は親要素の構造と動作を共有します.
具体的な実施例:
動物クラスと猫クラスの関係、引き継ぎ道具クラスと飛行機クラスの関係、猫クラスは動物クラスであり、それらは関係を持っています。
コードの実施例:
public class Animal {
public void eat() {
System.out.println("动物会吃东西");
}
public void speak() {
System.out.println("动物会吼叫");
}
}
//猫类重写了父类的方法
public class Cat extends Animal{
public void eat() {
System.out.println("猫吃老鼠");
}
public void speak() {
System.out.println("猫会喵喵叫");
}
}
UML クラス図では、次の図に示すように、中空の三角形を使用して親クラスを指し、実線を使用します。
この例では、cat クラスは animal クラスを継承し、親クラスのメソッドをオーバーロードできます. extends キーワードを使用して親クラスを継承し、private メソッドとプロパティを除く親クラスのすべてのメソッドとプロパティを継承できます.
6.実現
概念:実現とは、分類子間のセマンティックな関係です。ある分類子は、別の分類子によって強制されることが保証されているコントラクトを指定します。
具体的な実施例:
Java はインターフェイスを介して多重継承を実装します. インターフェイスまたは抽象クラスは一連の操作を定義し、特定の実装クラスはインターフェイスの特定の操作を完了します.
コードの実施例:
public interface PaoMian {
public void jiashui();//往泡面加热水
public void waitTime();//等待泡面泡熟
public void eatMian();//开吃
}
public class EatPaoMian implements PaoMian{
@Override
public void jiashui() {
// TODO 自动生成的方法存根
System.out.println("往泡面加入热水");
}
@Override
public void waitTime() {
// TODO 自动生成的方法存根
System.out.println("等待三分钟...");
}
@Override
public void eatMian() {
// TODO 自动生成的方法存根
System.out.println("泡面熟了,开吃");
}
}
UML クラス図では、次の図に示すように、中空の三角形を使用してインターフェースを指し、中空の線を使用します。
この例では、抽象的なインターフェース Instant Noodles で、水を入れる、待つ、食べ始めるという 3 つの操作が定義されており、クラス Eating Instant Noodles はこのインターフェースを実装し、即席めんの処理操作を具現化しています。