//未使用外观模式
        static void Main(string[] args)
        {
            var registerCourse = new RegisterCourse();
            registerCourse.CheckAvailable(“请假10天”);
            var reply = new Reply();
            reply.Notify(“小明”);
            Console.Read();
        }
   #region 子系统
    //审批
    public class RegisterCourse
    {
        public bool CheckAvailable(string courseName)
        {
            Console.WriteLine(“正在审批 {0} 的申请”, courseName);
            return false;
        }
    }
    //回复
    public class Reply
    {
        public bool Notify(string staffName)
        {
            Console.WriteLine(“检查staffName的申请是否通过!”);
            return true;
        }
    }
    #endregion
//使用外观模式
    class Staff
    {
        private static RegistrationFacade facade = new RegistrationFacade();
        static void Main(string[] args)
        {
            Console.WriteLine(facade.ApplyVacation(“请假10天”, “小明”) ? “批准” : “申请失败”);
            Console.Read();
        }
    }
    public class RegistrationFacade
    {
        private RegisterCourse registerCourse;
        private Reply reply;
        public RegistrationFacade()
        {
            registerCourse = new RegisterCourse();
            reply = new Reply();
        }
        public bool ApplyVacation(string info, string name)
        {
            if (!registerCourse.CheckAvailable(info))
            {
                return false;
            }
            return reply.Notify(name);
        }
    }
    #region 子系统
    //审批
    public class RegisterCourse
    {
        public bool CheckAvailable(string courseName)
        {
            Console.WriteLine(“正在审批 {0}”, courseName);
            return false;
        }
    }
    //回复
    public class Reply
    {
        public bool Notify(string staffName)
        {
            Console.WriteLine(“回复{0}通知”, staffName );
            return true;
        }
    }
    #endregion

在以下情况下可以考虑使用外观模式:

  • 外一个复杂的子系统提供一个简单的接口
  • 提供子系统的独立性
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子

优点:

  1. 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
  2. 外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
缺点:
  1. 如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。
PS:外观模式,员工请假。需要得到小组长(工作)的批准,得到项目经理(小组长 + 自己)的批准,老板(小组长+项目经理+自己)的批准
…这样增加了请假的复杂度。
解决办法(人事部)
那么员工可以直接向人事部提出申请,统一的反馈。