浅学设计模式之外观<Facade>模式
来源:互联网 发布:亚太示范电子口岸网络 编辑:程序博客网 时间:2024/05/19 12:17
外观模式是软件工程中常用的一种软件设计模式。它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用。
下图是状态模式的UML图。
结构
Facade
这个外观类为子系统中Packages 1、2、3提供一个共同的对外接口
Clients
客户对象通过一个外观接口读写子系统中各接口的数据资源。
Packages
客户可以通过外观接口读取的内部库。
下面看下一个小例子吧,看DVD的故事:
先得有个电视:
public class TV {public void turnOn(){System.out.println("打开电视");}public void turnOff(){System.out.println("关闭电视");}}
DVD:
public class DVD {public void turnOn(){System.out.println("打开DVD");}public void putDVD(MovieDisc movie){System.out.println("放进碟片");System.out.println("现在开始播放:"+movie.getMovieName());}public void takeOut(MovieDisc movie){System.out.println("停止播放:"+movie.getMovieName());System.out.println("取出碟片");}public void turnOff(){System.out.println("关闭DVD");}}
影片:
public class MovieDisc {private String movieName ;public MovieDisc(String movieName){this.movieName = movieName;System.out.println("这个电影名字叫做:"+movieName);}public String getMovieName(){return movieName;}}
我们想看电影的时候:
//打开电视,dvd,放进影片,开始看电影tv.turnOn();dvd.turnOn();dvd.putDVD(movie);//看完了,接着看另外一部dvd.takeOut(movie);MovieDisc movie2 = new MovieDisc("黄金大劫案");dvd.putDVD(movie2);//看完了,关机睡觉dvd.takeOut(movie);dvd.turnOff();tv.turnOff();
客户调用非常复杂,什么事都得自己做。。。
使用外观模式:
public class HomeTheater {DVD dvd = null;TV tv =null;MovieDisc movie = null;public HomeTheater(DVD dvd,TV tv,MovieDisc movie){this.dvd = dvd;this.movie = movie;this.tv =tv;}public void watchMovie() {tv.turnOn();dvd.turnOn();dvd.putDVD(movie);}public void endMovie(){dvd.takeOut(movie);dvd.turnOff();tv.turnOff();}public void chageMovie(MovieDisc movie2){dvd.takeOut(movie);dvd.putDVD(movie2);this.movie = movie2;}}
当想看电影的时候呢:
HomeTheater homeTheater = new HomeTheater(dvd, tv, movie);homeTheater.watchMovie();homeTheater.chageMovie(movie2);homeTheater.endMovie();
只需要调用几个简单的接口就可以了。
看下完整的测试类:
public class Tets {public static void main(String[] args){//生成电视,DVD,碟片TV tv = new TV();DVD dvd = new DVD();MovieDisc movie = new MovieDisc("桃姐");//打开电视,dvd,放进影片,开始看电影tv.turnOn();dvd.turnOn();dvd.putDVD(movie);//看完了,接着看另外一部dvd.takeOut(movie);MovieDisc movie2 = new MovieDisc("黄金大劫案");dvd.putDVD(movie2);//看完了,关机睡觉dvd.takeOut(movie);dvd.turnOff();tv.turnOff();System.out.println("--------使用家庭影院-------");HomeTheater homeTheater = new HomeTheater(dvd, tv, movie);homeTheater.watchMovie();homeTheater.chageMovie(movie2);homeTheater.endMovie();}}
结果:
这个电影名字叫做:桃姐
打开电视
打开DVD
放进碟片
现在开始播放:桃姐
停止播放:桃姐
取出碟片
关闭DVD
关闭电视
停止播放:桃姐
取出碟片
这个电影名字叫做:黄金大劫案
放进碟片
现在开始播放:黄金大劫案
--------使用家庭影院-------
打开电视
打开DVD
放进碟片
现在开始播放:桃姐
停止播放:桃姐
取出碟片
放进碟片
现在开始播放:黄金大劫案
停止播放:黄金大劫案
取出碟片
关闭DVD
关闭电视
客户端,只短短调用几行代码,就实现了功能,没那么繁琐。
注意和其他设计模式的区别
代理模式
1 代理模式中的原类和代理类继承同一父类;
2 原类对象与代理类对象接口相同,功能一致;
3 起到了隐藏原类的作用。
适配器模式
1 只有适配器继承目标接口;
2 将原有类接口转换为目标代码需求的接口。
外观模式
是多个类的集成、统一适配。
学习外观模式很好的资料:
http://www.cnblogs.com/hegezhou_hot/archive/2010/12/06/1897398.html
以上很多资料从网上整理而来。
- 浅学设计模式之外观<Facade>模式
- 浅学设计模式之外观<Facade>模式
- 设计模式之Facade(外观)
- 设计模式之Facade(外观)
- 设计模式之Facade (外观)
- 设计模式之Facade模式(外观模式)
- 设计模式之Facade外观模式
- 设计模式之Facade(外观)模式
- 设计模式之外观(Facade)模式
- 设计模式学习之---Facade(外观)模式
- 设计模式之Facade-外观模式
- 设计模式之八、外观模式Facade
- 设计模式之(五)外观模式Facade
- 设计模式之外观模式(Facade)
- 设计模式之外观模式(Facade Pattern)
- 设计模式之九 --- 外观(Facade)模式
- 设计模式之外观模式 facade
- 设计模式之外观模式Facade
- VIM的正则表达式
- 用CFile遍历文件夹
- 减法变加法------补码----同余理论
- Java内部类
- 全国城市 在一个表中 sqlserver 版,执行语句
- 浅学设计模式之外观<Facade>模式
- 强连通分量缩点的模板
- Microsoft Visual Studio 6.0安装SP6补丁详解
- 异常解决---MyEclipse中 Address already in use:JVM_Bind:8080的错误情况
- C++读取歌词文件(LRC),分解时间和歌词的方法
- 卸载sql server 2005后重装出错,(Performance Monitor Counter Requirement)解决方法
- 多重背包问题的应用
- hdoj 1520 Anniversary Party
- 互斥对象 Mutex 和MFC中的CMutex