设计模式之七:外观模式(家庭影院)

外观模式(facade):提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

设计原则---"最少知识"原则:只和你的密友谈话。

原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分。

方针:就任何对象而言,在该对象的方法内,我们只应该调用属于以下范围的方法:

1)该对象本身;

2)被当做方法的参数而传递进来的对象;

3)此方法所创建或实例化的任何对象;

4)对象的任何组件。

public float getTemp(){ //这个方法耦合了一个类

  return station.getThermometer().getTemperature();

}

 1 package com.jyu.test;
 2 
 3 /**
 4  * 这是一个汽车类,展示调用方法的各种做法,同时还能够遵守“最少知识”原则。
 5  * @author JRSmith
 6  *
 7  */
 8 public class Car {
 9 
10     Engine engine;//这是类的一个组件我们能调用它的方法。
11     
12     public Car(){
13         //初始化发动机
14     }
15     
16     public void start(Key key) {//被当做参数传进来的对象,其方法可以被调用。
17         Doors doors = new Doors();//在这里创建一个新的对象,它的方法可以被调用。
18         
19         boolean authorized = key.turns();
20         
21         if(authrized) {
22             engine.start();//可以调用对象组件的方法。
23             updateDashboardDisplay();//可以调用同一个对象内的本地方法。
24             doors.lock();//可以调用你所创建或实例化对象的方法。
25         }
26     }
27     public void updateDashboardDisplay(){
28         //更新显示
29     }
30 }

 项目名:Facade  下载目录:http://www.cnblogs.com/jrsmith/admin/Files.aspx  Facade.zip

 1 package com.jyu.equipment;
 2 
 3 /**
 4  * 屏幕
 5  * @author JRSmith
 6  *
 7  */
 8 public class Screen {
 9 
10     public void down() {
11         System.out.println("The screen is down...");
12     }
13     
14     public void up() {
15         System.out.println("The screen is up...");
16     }
17 }
 1 package com.jyu.homethreaterfacade;
 2 
 3 import com.jyu.equipment.Amplifier;
 4 import com.jyu.equipment.DvdPlayer;
 5 import com.jyu.equipment.PopcornPopper;
 6 import com.jyu.equipment.Projector;
 7 import com.jyu.equipment.Screen;
 8 import com.jyu.equipment.ThreaterLights;
 9 /**
10  * 家庭影院
11  * @author JRSmith
12  *
13  */
14 public class HomeThreaterFacade {
15 
16     Amplifier amp;
17     DvdPlayer dvd;
18     Projector projector;
19     ThreaterLights lights;
20     Screen screen;
21     PopcornPopper popper;
22     
23     public HomeThreaterFacade(Amplifier amp, DvdPlayer dvd, Projector projector, ThreaterLights lights,
24     Screen screen,PopcornPopper popper) {
25         this.amp = amp;
26         this.dvd = dvd;
27         this.projector = projector;
28         this.lights = lights;
29         this.screen = screen;
30         this.popper = popper;
31     }
32 
33     /**看电影*/
34     public void watchMovie(String movie) {
35         System.out.println("Get ready to watch to watch a movie...");
36         
37         popper.on();
38         popper.pop();
39         lights.dim(10);
40         screen.down();
41         projector.on();
42         projector.wideScreenMode();
43         amp.on();
44         amp.setDvd(dvd);
45         amp.setVolume(5);
46         dvd.on();
47         dvd.play(movie);
48     }
49     
50     /**结束观看电影模式*/
51     public void endMovie() {
52         System.out.println("Shuting movie theater down...");
53         popper.off();
54         lights.off();
55         screen.up();
56         projector.off();
57         amp.off();
58         dvd.stop();
59         dvd.eject();
60         dvd.off();
61     }
62 }
 1 package com.jyu.test;
 2 
 3 import com.jyu.equipment.Amplifier;
 4 import com.jyu.equipment.DvdPlayer;
 5 import com.jyu.equipment.PopcornPopper;
 6 import com.jyu.equipment.Projector;
 7 import com.jyu.equipment.Screen;
 8 import com.jyu.equipment.ThreaterLights;
 9 import com.jyu.homethreaterfacade.HomeThreaterFacade;
10 
11 public class HomeTheaterTestDrive {
12     
13     public static void main(String[] args) {
14         Amplifier amp = new Amplifier();
15         DvdPlayer dvd = new DvdPlayer();
16         Projector projector = new Projector();
17         ThreaterLights lights = new ThreaterLights();
18         Screen screen = new Screen();
19         PopcornPopper popper = new PopcornPopper();
20         
21         HomeThreaterFacade homeTheater = new HomeThreaterFacade(amp, dvd, projector, lights, screen, popper);
22         
23         homeTheater.watchMovie("Raiders of the Lost Ark");
24         System.out.println("---------------movie ends-----------------");
25         homeTheater.endMovie();
26     }
27 
28 }
原文地址:https://www.cnblogs.com/damonhuang/p/2711667.html