设计模式之七:外观模式(家庭影院)
外观模式(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 }