模式导读:
生活中,我们时常都会接触到各种各样的物品,它们都有各自不同的功能,外形,我们在购买它们时它们已经是个完全体,已经拥有了颜色,漂亮的外观形状等等,我们并不清楚它们是经过怎样的工序最后上架售卖的,这便是外观模式的常见场景。同时在我们写程序时也会经常出现这样的场景,为减少一个软件实体与其他实体的相互作用,我们一般会借助一个类似现实生活中的服务员类,将所需要的其他类对象方法封装在服务员类里面,这样便于我们调用,更能提高效率。为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用,这就是外观模式。
参考类图:
代码实现:
1.定义一个抽象的产品接口
1 package com.etc.facade; 2 //定义一个台式电脑的抽象接口 3 public interface Desktop{ 4 5 void design(); 6 7 }
2.具体产品部件子类
1 package com.etc.facade; 2 //键盘 3 public class KeyBoard implements Desktop{ 4 5 @Override 6 public void design() { 7 System.out.println("键盘已成功装配!"); 8 } 9 10 }
1 package com.etc.facade; 2 //主机箱 3 public class MasterBox implements Desktop{ 4 5 @Override 6 public void design() { 7 System.out.println("主机箱已成功装配!"); 8 } 9 10 }
1 package com.etc.facade; 2 //鼠标 3 public class Mouse implements Desktop{ 4 5 @Override 6 public void design() { 7 System.out.println("鼠标已成功装配!"); 8 } 9 10 }
1 package com.etc.facade; 2 //显示屏 3 public class Screen implements Desktop{ 4 5 @Override 6 public void design() { 7 System.out.println("显示屏已成功装配!"); 8 } 9 10 }
3.外观类,将各部件组装起来
1 package com.etc.facade; 2 3 public class Facade { 4 5 private Desktop keyBoard; 6 private Desktop master; 7 private Desktop mouse; 8 private Desktop screen; 9 10 //将所有需要的部件组装起来 11 public void construct() { 12 //实例化对象 13 keyBoard=new KeyBoard(); 14 master=new MasterBox(); 15 mouse=new Mouse(); 16 screen=new Screen(); 17 18 keyBoard.design(); 19 master.design(); 20 mouse.design(); 21 screen.design(); 22 } 23 24 }
4.客户端类
1 package com.etc.facade; 2 //客户端类 3 public class Client { 4 5 public static void main(String[] args) { 6 Facade facade=new Facade(); 7 facade.construct(); 8 } 9 }
效果截图:
外观模式优缺点:
优点:
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
缺点:
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
适用场景:
1、为复杂的模块或子系统提供外界访问的模块。
2、子系统相对独立。
3、预防低水平人员带来的风险。