23種java設計模式之外觀模式
今天,我們就用一個家庭影院專案來說明外觀模式。
家庭影院的專案分析:
在設計之前,我們可以分析一下,整個系統,我們需要做些什麼呢?我們要開啟爆米花機,放下螢幕,開投影儀,開音響,開DVD,選DVD,去拿爆米花,調暗燈光,播放電影,結束後關閉各種裝置。這樣整個系統會涉及很多物件,雖說不是每個物件都有聯絡,但是每個物件之間需統籌,比如投影儀和螢幕兩個物件並沒有什麼聯絡,但是它們需要同時開啟,所以我們利用外觀者模式來解決這個專案,類圖分析如下:
對於每一個物件,我們結合單例模式來做,因為這種系統每一個物理實體其實都是一個物件,不用new什麼的來完成,他進來本身就是一個物件,物理實體直接單例就行了
接下來我給出某幾個物件的程式碼,其他的就一樣的,就不必一一給出了:
燈光類:TheaterLights
public class TheaterLights {
private static TheaterLights instance=null;
private TheaterLights(){
}
public static TheaterLights getInstance(){
if(instance==null){
instance=new TheaterLights();
}
return instance;
}
public void on(){
System.out.println("燈光開啟!!!");
}
public void off(){
System.out.println("燈光關閉!!!");
}
public void dim(int d){
System.out.println("把亮度調為:"+d);
}
public void bright(){
dim(100);
System.out.println("燈光調亮");
}
}
音響類:Stereo
public class Stereo {
private static Stereo instance=null;
private static int volume=5;
private Stereo(){
}
public static Stereo getInstance(){
if(instance==null){
instance=new Stereo();
}
return instance;
}
public void on(){
System.out.println("音響開啟!!!");
}
public void off(){
System.out.println("音響關閉!!!");
}
public void setVolume(int vol){
volume=vol;
System.out.println("音響調為:"+volume);
}
public void addVolume(){
if(volume<11){
volume++;
setVolume(volume);
}
}
}
.......
然後我們給出重點部分,外觀模式,這裡就相當於一個遙控器,它為了控制這個系統,它需要引用前面給出的那些物件,例項要獲取到,然後用一個函式呼叫很多前面的方法,也就是用一個函式實現前面的一系列方法。
public class HomeTheaterFacade {
private TheaterLights light;
private Popcorn popcorn;
private Projector projector;
private Screen screen;
private DvdPlayer dvdPlayer;
private Stereo stereo;
public HomeTheaterFacade(){
light=TheaterLights.getInstance();
popcorn=Popcorn.getInstance();
projector=Projector.getInstance();
screen=Screen.getInstance();
dvdPlayer=DvdPlayer.getInstance();
stereo=Stereo.getInstance();
}
public void ready(){
popcorn.on();
popcorn.pop();
screen.down();
projector.on();
stereo.on();
dvdPlayer.on();
dvdPlayer.setCd();
light.dim(10);
}
public void end(){
popcorn.off();
light.bright();
screen.up();
projector.off();
dvdPlayer.setCd();
dvdPlayer.off();
}
public void play(){
dvdPlayer.play();
}
public void pause(){
dvdPlayer.pause();
}
}
最後測試Test:
public class Test {
public static void main(String[] args) {
HomeTheaterFacade homeTheaterFacade=new HomeTheaterFacade();
homeTheaterFacade.ready();
homeTheaterFacade.play();
}
}
總結:
外觀模式:提供了一個統一的介面,來訪問子系統中一群功能相關介面,也可以通俗點說成一個系統,你要做一個動作,會涉及到很多物件,可以把它放在同一個類裡呼叫。