java设计模式-外观模式
1.**外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个一子系统更加容易使用**
2)外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用段只需跟这个接口发生调用,而无需关心这个子系统的内部细节
原理类图的说明(外规模式的角色)
- 外观类(Facade):为调用端提供统―的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象
- 调用者(Cliert):外观接口的调用者
- 子系统的集合:指模块或者子系统,处理Facade对象指派的任务,他是功能的提供者
比如电影院 播放电影 需要创建荧幕 和爆米花对象相应的功能 dvd对象的相应功能
使用外观模式则只需要 使用外观类直接使用看电影方法 自动会调用相应的方法
爆米花类
public class baomihua {
//使用饿汉式创建单例对象
private static baomihua BAOMIHUA=new baomihua();
private baomihua(){}
//直接使用类名.获取对象
public static baomihua getBAOMIHUA(){
return BAOMIHUA;
}
public void baomihuakaiji(){
System.out.println("爆米花开机");
}
public void zhabaomihua(){
System.out.println("炸爆米花");
}
}
DVD
public class Dvd {
private static Dvd DVD=new Dvd();
private Dvd(){}
public static Dvd getDVD(){
return DVD;
}
public void dvdkaiji(){
System.out.println("dvd开机");
}
public void dvdtouyin(){
System.out.println("播放");
}
public void close(){
System.out.println("关机");
}
银幕
//银幕
public class Screen {
private static Screen SCREEN=new Screen();
private Screen(){}
public static Screen getSCREEN(){
return SCREEN;
}
public void up(){
System.out.println("银幕升起");
}
public void down(){
System.out.println("银幕下降");
}
public void close(){
System.out.println("银幕关机");
}
}
外观类相当于遥控器 将其他类组合
//遥控器
public class Waiguanlei {
private Baomihua baomihua;
private Dvd dvd;
private Screen screen;
public Waiguanlei(){
this.baomihua= Baomihua.getBAOMIHUA();
this.dvd=Dvd.getDVD();
this.screen=Screen.getSCREEN();
}
//遥控器播放方法
public void bofangdianyin(){
baomihua.baomihuakaiji();
baomihua.zhabaomihua();
screen.down();
dvd.dvdkaiji();
dvd.dvdtouyin();
}
//遥控器播放关机
public void guanji(){
screen.up();
screen.close();
dvd.close();
}
}
测试类
public static void main(String[] args) {
//相当于遥控器
Waiguanlei waiguanlei=new Waiguanlei();
//播放电影
waiguanlei.bofangdianyin();
System.out.println("---------------");
//关闭电影
waiguanlei.guanji();
}
外观模式的注意事项和细节
- 外观模式对外展蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
- 外观模式对客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展
- 通过合理的使用外观模式,可以帮我们更好的划分访问的层次
- 当系统需要进行分层设计时,可以考虑使用Facade(外观)模式
- 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高复用性
- 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。
要以让系统有层次,利于维护为目的。
Mybatis中 configuration中源码分析