2019年5月13日 星期一

7天學會設計模式 CHAP11 表象(外觀)模式Facade

7天學會設計模式
http://www.books.com.tw/products/0010750585

chap11.
表象(外觀)模式Facade
目的:用一個介面包裝各個子系統,由介面與客戶端做溝通。
package com.ssc24.chap11.demo01;
public abstract class Electronics {
 private  boolean power = false;
 public void powerOn() {
  this.power = true;
 }
 public void powerOff() {
  this.power = false;
 }
 public boolean  isPowerOn() {
  return this.power;
 }
 protected void showStatus() {
  if (this.power) {
   System.out.println(this.getClass().getSimpleName() + " 運作中");
  } else {
   System.out.println(this.getClass().getSimpleName() + " 電源未開啟");
  }
 }
}

package com.ssc24.chap11.demo01;
public class KTVsystem extends Electronics {
 private String song;
 public void selectSong(String song) {
  this.song = song;
 }
 public void playSong() {
  System.out.println(this.getClass().getSimpleName() + " 播放 " + this.song);
 }
}

package com.ssc24.chap11.demo01;
public class PlayStation3 extends Electronics {
 private String cd;
 public void putCd(String cd) {
  this.cd = cd;
 }
 public String getCd() {
  return this.cd;
 }
 public void play() {
  System.out.println(this.getClass().getSimpleName() + " 開始播放 " + this.cd);
 }
 @Override
 public void showStatus() {
  super.showStatus();
  if(isPowerOn()) {
   System.out.println(this.getClass().getSimpleName() + " 目前放入cd:" + this.cd);
  }
 }
}

package com.ssc24.chap11.demo01;
public class Stereo extends Electronics {
 private int sound = 50;
 public void setSound(int sound) {
  this.sound = sound;
 }
 public int getSound() {
  return this.sound;
 }
 @Override
 public void showStatus() {
  super.showStatus();
  if (isPowerOn()) {
   System.out.println(this.getClass().getSimpleName() + " 音量為:" + this.sound);
  }
 }
}

package com.ssc24.chap11.demo01;
public class Television extends Electronics {
 private int sound = 50;
 private String source = "tvBox";
 private int channel = 9;
 public void setSound(int sound) {
  this.sound = sound;
 }
 public void switchSource(String source) {
  this.source = source;
 }
 public void switchChannel(int channel) {
  this.channel = channel;
 }
 public void showTV() {
  System.out.println("目前觀看的頻道是: " + this.channel);
 }
 @Override
 public void showStatus() {
  super.showStatus();
  if (isPowerOn()) {
   System.out.print(this.getClass().getSimpleName() + " 音量為:" + this.sound);
   if ("tvBox".equals(this.source)) {
    System.out.println(" ,頻道:" + this.channel);
   }
   if ("ktv".equals(this.source)) {
    System.out.println(" ,ktv播放中:" + this.channel);
   }
   if ("ps".equals(this.source)) {
    System.out.println(" ,ps畫面顯示中:" + this.channel);
   }
  }
 }
 public int getSound() {
  return this.sound;
 }
 public int getSource() {
  return this.getSource();
 }
 public int getChannel() {
  return this.channel;
 }
}

package com.ssc24.chap11.demo01;
public class VideoRoomFacade {
 Television tv = new Television();
 Stereo stereo = new Stereo();
 PlayStation3 ps = new PlayStation3();
 KTVsystem ktv = new KTVsystem();
 public void readyPlayMovie(String cd) {
  this.stereo.powerOn();
  this.tv.powerOn();
  this.tv.setSound(50);
  this.tv.switchSource("ps");
  ps.powerOn();
  ps.putCd(cd);
 }
 public void playMovie() {
  if (ps.isPowerOn()) {
   ps.play();
  }
 }
 public void showTV() {
  this.tv.showTV();
 }
 public void turnOffAll() {
  this.stereo.powerOff();
  this.ktv.powerOff();
  this.ps.powerOff();
  this.tv.powerOff();
 }
 public void watchTv() {
  this.tv.powerOn();
  this.tv.switchSource("tvBox");
 }
 public void SwitchChannel(int channel) {
  this.tv.switchChannel(channel);
 }
 public void readyKTV() {
  this.stereo.powerOn();
  this.ktv.powerOn();
  this.tv.powerOn();
  this.tv.setSound(50);
  this.tv.switchSource("ktv");
 }
 public void selectSong(String song) {
  if(this.ktv.isPowerOn()) {
   this.ktv.selectSong(song);
  }
 }
 public void playSong() {
  if(this.ktv.isPowerOn()) {
   this.ktv.playSong();
  }
 }
 public void setSound(int soundLevel) {
  if (this.tv.isPowerOn()) {
   this.tv.setSound(soundLevel);
  }
  if(this.stereo.isPowerOn()) {
   this.stereo.setSound(soundLevel);
  }
 }
 public void showAllStatus() {
  this.tv.showStatus();
  this.stereo.showStatus();
  this.ps.showStatus();
  this.ktv.showStatus();
 }
}

/**
===外觀模式測試===
---看電影---
PlayStation3 開始播放 Life of Pi
Television 運作中
Television 音量為:50 ,ps畫面顯示中:9
Stereo 運作中
Stereo 音量為:50
PlayStation3 運作中
PlayStation3 目前放入cd:Life of Pi
KTVsystem 電源未開啟

---關機器---
Television 電源未開啟
Stereo 電源未開啟
PlayStation3 電源未開啟
KTVsystem 電源未開啟

---看電視---
目前觀看的頻道是: 9
目前觀看的頻道是: 20
Television 電源未開啟
Stereo 電源未開啟
PlayStation3 電源未開啟
KTVsystem 電源未開啟

---唱KTV---
KTVsystem 播放 Moon
Television 運作中
Television 音量為:50 ,ktv播放中:20
Stereo 運作中
Stereo 音量為:50
PlayStation3 電源未開啟
KTVsystem 運作中
Television 電源未開啟
Stereo 電源未開啟
PlayStation3 電源未開啟
KTVsystem 電源未開啟
**/