[オブジェクト指向]某コーヒーショップの注文をイメージしてプログラムを書いてみた。


アウトプット用!!
第7回目は
has-aの関係を意識してプログラムを行なっていく！
（has-a）とはあるクラスが別のクラスをフィールドとして利用している関係のことです。
例えば、Hero型のクラスとSword型のクラスがあるとしてHeroクラスのメンバ変数にSwordクラスのデータが使えるようになるイメージです。よって勇者は剣を持っている(has-a)の関係が成り立つ。

今回作成したプログラムは(has-a)を意識して作成しました。
SetMenuクラスはMenuクラスを持っている(has-a)の関係が成り立つので、SetMenuクラスでMenuクラスのデータが使えるようになる。

早速コードをみていきましょう。

```Main.java
package ensyu;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
	public static void main(String[] args) {
		
		//現在日時を取得
		Date dateObj = new Date();
		SimpleDateFormat format = new SimpleDateFormat( "HH" );
		String display = format.format( dateObj );
		
		int num = Integer.parseInt(display);
		
		//9時から10時はモーニングセットを注文
		if(9 <= num && num <= 10) {
			Menu drink = new Menu("コーヒー", 350);
			Menu bread  = new Menu("サンドイッチ",300);
			SetMenu MorningSet = new SetMenu("モーニングセット",drink,bread, 0.8);
			MorningSet.display();
		
		//11時から13時まではバリューセットを注文
		} else if(10 <= num && num <= 13 ) {
			Menu drink = new Menu("アメリカン", 300);
			Menu bread  = new Menu("チョコクロ", 190);
			SetMenu ValueSet = new SetMenu("バリューセット",drink,bread);
			ValueSet.display();
		
		//14時以降は通常メニューで注文
		}  else {
			Menu drink = new Menu("コーヒー", 350);
			Menu bread = new Menu("ザクザクドック", 390);
			NomalMenu Nomal = new NomalMenu("通常メニュー",drink,bread, 0.7);
			Nomal.display();
			
		}
	
```

```Menu.java
package ensyu;

public class Menu {
	String name;
	int price;
	
	Menu(String name, int price) {
		this.name = name;
		this.price = price;
	}
	
	public void display() {
		System.out.println(name + ":" + price + "円");
	}
}
```

```SetMenu.java
package ensyu;

public class SetMenu {
	String name;
	Menu drink;
	Menu bread;
    double tax;
	
	SetMenu(String name, Menu drink, Menu bread, double rate) {
		this.name = name;
		this.drink = drink;
		this.bread = bread;
        this.tax = rate;  
	}
	
	public void display() {
		System.out.println(name + ":" + (int)(100 - (100 * rate))"%引き");
		System.out.println("---");
		//Menu has-a SetMenu(メニューはセットメニュを持っている)
		drink.display();
		bread.display();
		System.out.println("---");
		int price = (int)((drink.price + bread.price)*rate);
		System.out.println("セット価格:"+ price + "円");
	}
	
}
```

```NomalMenu.java
package ensyu;

public class NomalMenu {
	String name;
	Menu drink;
	Menu bread;
	
	
	NomalMenu(String name, Menu drink, Menu bread) {
		this.name = name;
		this.drink = drink;
		this.bread = bread;
	}
	
	public void display() {
		System.out.println(name);
		System.out.println("---");
		
		drink.display();
		bread.display();
		System.out.println("---");
		int price = drink.price + bread.price;
		System.out.println("合計金額は" + price + "円です");
	}
	
}

```
#解説
##main.java
###①現在の時刻を取得
　　javaAPIで

###②現在時刻を取得できたらif文で条件分岐を行う。
　9時から10時まではモーニングセットを注文。
　11時から13時まではバリューセットを注文。
　14時以降は通常メニューを注文。

###③インスタンスを作成する
　MenuインスタンスとSetMenuインスタンスとNomalインスタンスを生成する。
　インスタンス生成時に()の引数が、コンストラクタが自動実行される際にパラメータとして渡される。
　例えば、Menu drink = new Menu("コーヒ", 350);の場合
　Menuクラスのコンストラクタに引数の値が渡されるイメージ。

##SetMenu.java
　main.javaでSetMenuインスタンスを生成する。生成時に引数にMenuインスタンスをセットして
　SetMenuクラスのコンストラクタに引数の値が渡されるイメージ。
　SetMenu has-a Menuが成り立つのでSetMenuクラスでMenuクラスのデータが使えるようになった。

##処理結果
```コンソール.java
モーニングセット:20%引き
---
コーヒー:350円
サンドイッチ:300円
---
セット価格:520円

```

##*モーニングセットの場合20パーセント引きに、バリューセットの場合は30%引きに。通常の場合は割引なし。
###以上です。 

　お疲れさまでした。
　これからも楽しみながらプログラムがんばりたいと思います。
　今回のコードはもっと簡潔に書けると思うので、もしよかったらご教授お願いいたします。