java设计模式-外观模式

模式导读:

        生活中,我们时常都会接触到各种各样的物品,它们都有各自不同的功能,外形,我们在购买它们时它们已经是个完全体,已经拥有了颜色,漂亮的外观形状等等,我们并不清楚它们是经过怎样的工序最后上架售卖的,这便是外观模式的常见场景。同时在我们写程序时也会经常出现这样的场景,为减少一个软件实体与其他实体的相互作用,我们一般会借助一个类似现实生活中的服务员类,将所需要的其他类对象方法封装在服务员类里面,这样便于我们调用,更能提高效率。为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用,这就是外观模式。

参考类图:

代码实现:

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、预防低水平人员带来的风险。

原文地址:https://www.cnblogs.com/weekstart/p/10884726.html