浅学设计模式之外观模式

外观模式是软件工程中常用的一种软件设计模式。它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用。

下图是状态模式的UML图。


浅学设计模式之外观<Facade>模式_第1张图片



 

结构

  Facade

  这个外观类为子系统中Packages 1、2、3提供一个共同的对外接口

  Clients

  客户对象通过一个外观接口读写子系统中各接口的数据资源。

  Packages

  客户可以通过外观接口读取的内部库。

 

 下面看下一个小例子吧,看DVD的故事:

先得有个电视:

[java] view plain copy
  1. public class TV {  
  2.     public void turnOn(){  
  3.         System.out.println("打开电视");  
  4.     }  
  5.       
  6.     public void turnOff(){  
  7.         System.out.println("关闭电视");  
  8.     }  
  9. }  

DVD:
[java] view plain copy
  1. public class DVD {  
  2.     public void turnOn(){  
  3.         System.out.println("打开DVD");  
  4.     }  
  5.       
  6.     public void putDVD(MovieDisc movie){  
  7.         System.out.println("放进碟片");  
  8.         System.out.println("现在开始播放:"+movie.getMovieName());  
  9.     }  
  10.       
  11.     public void takeOut(MovieDisc movie){  
  12.         System.out.println("停止播放:"+movie.getMovieName());  
  13.         System.out.println("取出碟片");  
  14.     }  
  15.       
  16.     public void turnOff(){  
  17.         System.out.println("关闭DVD");  
  18.     }  
  19. }  

影片:
[java] view plain copy
  1. public class MovieDisc {  
  2.     private String movieName ;  
  3.       
  4.     public MovieDisc(String movieName){  
  5.         this.movieName = movieName;  
  6.         System.out.println("这个电影名字叫做:"+movieName);  
  7.     }  
  8.       
  9.     public String getMovieName(){  
  10.         return movieName;  
  11.     }  
  12. }  

我们想看电影的时候:
[java] view plain copy
  1. //打开电视,dvd,放进影片,开始看电影  
  2.         tv.turnOn();  
  3.         dvd.turnOn();  
  4.         dvd.putDVD(movie);  
  5.           
  6.         //看完了,接着看另外一部  
  7.         dvd.takeOut(movie);  
  8.         MovieDisc movie2 = new MovieDisc("黄金大劫案");  
  9.         dvd.putDVD(movie2);  
  10.           
  11.         //看完了,关机睡觉  
  12.         dvd.takeOut(movie);  
  13.         dvd.turnOff();  
  14.         tv.turnOff();  

客户调用非常复杂,什么事都得自己做。。。

使用外观模式:

[java] view plain copy
  1. public class HomeTheater {  
  2.     DVD dvd = null;  
  3.     TV tv =null;  
  4.     MovieDisc movie = null;  
  5.       
  6.     public HomeTheater(DVD dvd,TV tv,MovieDisc movie){  
  7.         this.dvd = dvd;  
  8.         this.movie = movie;  
  9.         this.tv =tv;  
  10.     }  
  11.       
  12.     public void watchMovie() {  
  13.         tv.turnOn();  
  14.         dvd.turnOn();  
  15.         dvd.putDVD(movie);  
  16.     }  
  17.       
  18.     public void endMovie(){  
  19.         dvd.takeOut(movie);  
  20.         dvd.turnOff();  
  21.         tv.turnOff();  
  22.     }  
  23.       
  24.     public void chageMovie(MovieDisc movie2){  
  25.         dvd.takeOut(movie);  
  26.         dvd.putDVD(movie2);  
  27.         this.movie = movie2;  
  28.     }  
  29.       
  30. }  

当想看电影的时候呢:
[java] view plain copy
  1. HomeTheater homeTheater = new HomeTheater(dvd, tv, movie);  
  2.         homeTheater.watchMovie();  
  3.         homeTheater.chageMovie(movie2);  
  4.         homeTheater.endMovie();  

只需要调用几个简单的接口就可以了。

看下完整的测试类:

[java] view plain copy
  1. public class Tets {  
  2.     public static void main(String[] args){  
  3.         //生成电视,DVD,碟片  
  4.         TV tv = new TV();  
  5.         DVD dvd = new DVD();  
  6.         MovieDisc movie = new MovieDisc("桃姐");  
  7.         //打开电视,dvd,放进影片,开始看电影  
  8.         tv.turnOn();  
  9.         dvd.turnOn();  
  10.         dvd.putDVD(movie);  
  11.           
  12.         //看完了,接着看另外一部  
  13.         dvd.takeOut(movie);  
  14.         MovieDisc movie2 = new MovieDisc("黄金大劫案");  
  15.         dvd.putDVD(movie2);  
  16.           
  17.         //看完了,关机睡觉  
  18.         dvd.takeOut(movie);  
  19.         dvd.turnOff();  
  20.         tv.turnOff();  
  21.           
  22.           
  23.           
  24.         System.out.println("--------使用家庭影院-------");  
  25.         HomeTheater homeTheater = new HomeTheater(dvd, tv, movie);  
  26.         homeTheater.watchMovie();  
  27.         homeTheater.chageMovie(movie2);  
  28.         homeTheater.endMovie();  
  29.     }  
  30. }  

结果:

这个电影名字叫做:桃姐
打开电视
打开DVD
放进碟片
现在开始播放:桃姐
停止播放:桃姐
取出碟片
关闭DVD
关闭电视
停止播放:桃姐
取出碟片
这个电影名字叫做:黄金大劫案
放进碟片
现在开始播放:黄金大劫案
--------使用家庭影院-------
打开电视
打开DVD
放进碟片
现在开始播放:桃姐
停止播放:桃姐
取出碟片
放进碟片
现在开始播放:黄金大劫案
停止播放:黄金大劫案
取出碟片
关闭DVD
关闭电视


客户端,只短短调用几行代码,就实现了功能,没那么繁琐。


注意和其他设计模式的区别

 

代理模式
1 代理模式中的原类和代理类继承同一父类;
2 原类对象与代理类对象接口相同,功能一致;
3 起到了隐藏原类的作用。

适配器模式
1 只有适配器继承目标接口;
2 将原有类接口转换为目标代码需求的接口。

外观模式
是多个类的集成、统一适配。


学习外观模式很好的资料:

http://www.cnblogs.com/hegezhou_hot/archive/2010/12/06/1897398.html


你可能感兴趣的:(浅学设计模式之外观模式)