Net设计模式实例之外观模式(Façade Pattern)-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

Net设计模式实例之外观模式(Façade Pattern)

简介:
+关注继续查看

一、外观模式简介(Brief Introduction

外观模式,为子系统的一组接口提供一个统一的界面,此模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。

 

二、解决的问题(What To Solve

1、分离不同的两个层

       典型的分层例子是Net三层架构,界面层与业务逻辑层分离,业务逻辑层与数据访问层分类。这样可以为子系统提供统一的界面和接口,降低了系统的耦合性。

2、减少依赖

       随着功能增加及程序的重构,系统会变得越来越复杂,这时增加一个外观可以提供一个简单的接口,减少他们之间的依赖。

3、为新旧系统交互提供接口

       有的时候,新系统需要旧系统的核心功能,而这个旧的系统已经很难维护和扩展,可以给新系统增加一个Façade类,是的新系统与Façade类交互,Façade类与旧系统交互素有复杂的工作。

三、外观模式分析(Analysis

1、外观模式结构

 

2、源代码

1、子系统类SubSystemOne

public class SubSystemOne

{

    public void MethodOne()

    {

        Console.WriteLine("执行子系统One中的方法One");

    }

}

 

2、子系统类SubSystemTwo

public class SubSystemTwo

{

    public void MethodTwo()

    {

        Console.WriteLine("执行子系统Two中的方法Two");

    }

}

 

3、子系统类SubSystemThree

public class SubSystemThree

{

    public void MethodThree()

    {

        Console.WriteLine("执行子系统Three中的方法Three");

    }

}

 

4Facade 外观类,为子系统类集合提供更高层次的接口和一致的界面

public class Facade

{

    SubSystemOne one;

    SubSystemTwo two;

    SubSystemThree three;

 

    public Facade()

    {

        one = new SubSystemOne();

        two = new SubSystemTwo();

        three = new SubSystemThree();

    }

 

    public void MethodA()

    {

        Console.WriteLine("开始执行外观模式中的方法A");

        one.MethodOne();

        two.MethodTwo();

        Console.WriteLine("外观模式中的方法A执行结束");

        Console.WriteLine("---------------------------");

    }

 

    public void MethodB()

    {

        Console.WriteLine("开始执行外观模式中的方法B");

        two.MethodTwo();

        three.MethodThree();

        Console.WriteLine("外观模式中的方法B执行结束");

    }

}

 

5、客户端代码

static void Main(string[] args)

{

    Facade facade = new Facade();

    facade.MethodA();

    facade.MethodB();

    Console.Read();

}

3、程序运行结果

四.案例分析(Example

1、场景

假设远程网络教育系统-用户注册模块包括功能有

1、验证课程是否已经满人

2、收取客户费用

3、通知用户课程选择成功

如下图所示

子系统类集合包括:PaymentGateway类、RegisterCourse类、NotifyUser

PaymentGateway类:用户支付课程费用

RegisterCourse类:验证所选课程是否已经满人以及计算课程的费用

NotifyUser类:用户选择课程成功与否"通知用户

RegistrationFacade类:外观类,提供一个统一的界面和接口,完成课程校验、网上支付、通知用户功能

2、代码

1、子系统类集合

1.   namespace FacadePattern   

2.   {   

3.       /// <summary>   

4.       /// Subsystem for making financial transactions   

5.       /// </summary>   

6.       public class PaymentGateway   

7.       {   

8.          public bool ChargeStudent(string studentName, int costTuition)   

9.           {   

10.               //Charge the student   

11.              Console.WriteLine(String.Format("Charging student {0} for ${1}", studentName, costTuition.ToString()));   

12.               return true;   

13.           }   

14.       }   

15.     

16.       /// <summary>   

17.       /// Subsystem for registration of courses   

18.       /// </summary>   

19.       public class RegisterCourse   

20.       {   

21.           public bool CheckAvailability(string courseCode)   

22.           {   

23.               //Verify if the course is available..   

24.              Console.WriteLine(String.Format("Verifying availability of seats for the course : {0}", courseCode));   

25.               return true;   

26.           }   

27.     

28.           public int GetTuitionCost(string courseCode)   

29.           {   

30.               //Get the cost of tuition   

31.               return 1000;   

32.           }   

33.       }   

34.     

35.       /// <summary>   

36.       /// Subsystem for Notifying users   

37.       /// </summary>   

38.       public class NotifyUser   

39.       {   

40.           public bool Notify(string studentName)   

41.           {   

42.              //Get the name of the instructor based on Course Code   

43.               //Notify the instructor   

44.              Console.WriteLine("Notifying Instructor about new enrollment");   

45.               return true;   

46.           }   

47.       }   

48.   }

 

 

2、外观类Façade Class

1.   /// <summary>   

2.       /// The Facade class that simplifies executing methods 

         in the subsystems and hides implementation for the client  

3.       /// </summary>   

4.       public class RegistrationFacade   

5.       {   

6.           private PaymentGateway _paymentGateWay;   

7.           private RegisterCourse _registerCourse;   

8.           private NotifyUser _notifyUser;   

9.     

10.           public RegistrationFacade()   

11.           {   

12.               _paymentGateWay = new PaymentGateway();   

13.               _registerCourse = new RegisterCourse();   

14.               _notifyUser = new NotifyUser();   

15.           }   

16.     

17.          public bool RegisterStudent(string courseCode, string studentName)   

18.           {   

19.               //Step 1: Verify if there are available seats   

20.               if (!_registerCourse.CheckAvailability(courseCode))   

21.                   return false;   

22.     

23.               //Step 2: Charge the student for tuition   

24.              if (!_paymentGateWay.ChargeStudent(studentName, _registerCourse.GetTuitionCost(courseCode)))   

25.                   return false;   

26.     

27.              //Step 3: If everything's successful so far, notify the instructor of the new registration   

28.               return _notifyUser.Notify(studentName);   

 

 

 

3、客户端代码

1.   namespace FacadePattern   

2.   {   

3.       class Program   

4.       {   

5.           static void Main(string[] args)   

6.           {   

7.              RegistrationFacade registrationFacade = new RegistrationFacade();   

8.              if (registrationFacade.RegisterStudent("DesignPatterns101""Jane Doe"))   

9.                  Console.WriteLine("Student Registration SUCCESSFUL!");   

10.               else  

11.                  Console.WriteLine("Student Registration Unsuccessful");   

12.           }   

13.       }   

14.   }  

 

五、总结(Summary

外观模式,为子系统的一组接口提供一个统一的界面,此模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。

外观模式可以解决层结构分离、降低系统耦合度和为新旧系统交互提供接口功能。


本文转自灵动生活博客园博客,原文链接:http://www.cnblogs.com/ywqu/archive/2010/01/20/1652108.html ,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
IOS设计模式第三篇之外观设计模式
外观设计模式: 这个外观设计模式提供了一个单独的接口给复杂的子系统。而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API。 下面的图片解释这个概念: API的用户根本不知道后面系统的复杂性。
878 0
【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )
【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )
8 0
JAVA设计模式(3)外观模式(门面模式)
2019年阿里云双11活动拼团:https://www.aliyun.com/1111/2019/group-buying-share 针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下。
583 0
Java描述设计模式(12):外观模式
本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景 1、场景描述 在移动互联网没有普及之前,去饭店吃饭的流程大致如下:选座位,排队,点菜,结账。后来移动互联网普及,通过手机APP就可以操作这些流程,非常的方便快捷:通过手机可以知道某饭店是不是还有空位,到了饭店之后直接入座,然后通过手机点菜,结账,中间省去了很多繁琐的流程。
6262 0
设计模式之十(外观模式)
原文:设计模式之十(外观模式) 前言 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用. 结构图 SubSystem  Class 子系统类集合 实现子系统的功能,处理Facade对象指派的任务,注意子类中没有Facade的任何信...
840 0
运维编排场景系列-----给ECS实例自动打TAG
Tag简介和场景 对于一般的资源管理需求,都是针对一个用户下数量较多的情况,当实例等数量较多时,对实例进行运维管理等操作就会变得比较困难,有时候甚至需要采取拆分账号的方式管理不同部门或者不同用途的资源。
1540 0
3404
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载