23种设计模式-11-外观模式

public class ValidateChooseSubject
    {
        public bool IsFull(string subjectName)
        {
            //模拟判断课程是否选满
            Console.WriteLine("判断{0}课程是否选满...", subjectName);
            var ran = new Random();
            var isFull = ran.Next(0, 10) % 2 == 0;
            Console.WriteLine("{0}课程{1}选满", subjectName, isFull ? "已经" : "暂未");
            return isFull;
        }
    }
    
    public class ChooseSubject
    {
        public void Choose(string subjectName)
        {
            Console.WriteLine("选课成功,您已选择{0}课程!", subjectName);
        }
    }
    
    public class SubjectNotify
    {
        public void Notify(string subjectName, bool isSuccess)
        {
            Console.WriteLine("通知:您{0}课程的选课结果为:{1}", subjectName, isSuccess ? "成功" : "失败");
        }
    }
private static void TestNormal()
        {
            //常规选课:
            var validateSubject = new ValidateChooseSubject();
            var chooseSubject = new ChooseSubject();
            var notify = new SubjectNotify();
            var subjectName = "轮滑";
            //判断是否选满
            var isFull = validateSubject.IsFull(subjectName);
            //没选满,选课
            if (!isFull)
            {
                chooseSubject.Choose(subjectName);
            }
            //选课完毕,发送通知
            notify.Notify(subjectName, !isFull);
        }

使用外观模式:

public class SubjectAppearance
    {
        public void ChooseSubject(string subjectName)
        {
            //外观模式,将后台系统封装在这里面,客户端要调用也是统一调用外观,不会直接请求后台系统
            var validateSubject = new ValidateChooseSubject();
            var chooseSubject = new ChooseSubject();
            var notify = new SubjectNotify();
            //判断是否选满
            var isFull = validateSubject.IsFull(subjectName);
            //没选满,选课
            if (!isFull)
            {
                chooseSubject.Choose(subjectName);
            }
            //选课完毕,发送通知
            notify.Notify(subjectName, !isFull);
        }
    }
class Program
    {
        /// <summary>
        /// 外观模式:
        /// 算是23种设计模式里面非常简单的一个模式,可以理解为面向对象三大特征的封装
        /// 先说下大概含义:
        /// 客户端在做一个业务逻辑操作时,需要调用系统后台三个接口
        /// 例如:学生选课:1.调用接口判断课程人数满了没有;2.没满的话选课;3.发送通知选课结果(成功or失败)
        /// 此时客户端需要调用后台三个接口,并且一旦业务有任何的变化,客户端or后台都有可能要修改
        /// 优点:客户端可以自定义自己的业务逻辑,根据不同业务调用不同接口
        /// 缺点:导致客户端和后台系统的耦合性非常的高
        /// 
        /// 使用外观模式,相当于给后台系统做了一个门面:
        /// 将一种特定的业务逻辑操作在外观封装起来
        /// 客户端只需要调用外观的那一端接口
        /// 至于外观调用了后台的什么接口,那就在外观中定义
        /// 这样客户端和后台系统的耦合性就非常低了
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //TestNormal();

            //上述所有的逻辑都在客户端,虽然实现了自定义,但是难以维护,耦合性也非常高

            TestAppearance();

            Console.WriteLine("End");
            Console.ReadKey();
        }

        private static void TestNormal()
        {
            //常规选课:
            var validateSubject = new ValidateChooseSubject();
            var chooseSubject = new ChooseSubject();
            var notify = new SubjectNotify();
            var subjectName = "轮滑";
            //判断是否选满
            var isFull = validateSubject.IsFull(subjectName);
            //没选满,选课
            if (!isFull)
            {
                chooseSubject.Choose(subjectName);
            }
            //选课完毕,发送通知
            notify.Notify(subjectName, !isFull);
        }

        private static void TestAppearance()
        {
            //外观模式,将后台系统封装在这里面,客户端要调用也是统一调用外观,不会直接请求后台系统
            var subjectAppearance = new SubjectAppearance();
            subjectAppearance.ChooseSubject("轮滑");
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值