设计模式(三)-结构型模式(5)-外观模式

一、为何需要外观模式(Facade)?

要实现一个大功能,我们需要将它拆分成多个子系统。然后每个子系统所实现的功能,就由一个称为外观的高层功能模块来调用。这种设计方式就称为外观模式。该模式在开发时常常被使用过,所以很容易理解,就不多说了。

特点:

某个功能模块存在多个子系统时,每个子系统实现各自的子任务,并且将它们组合在一起来完成一个完整的任务。

结构:

Facade(外观类):为子任务提供一个共同对外的高层接口。在客户端调用它的方法。

SubSystem(子系统类):实现子系统的功能。可以被外观类调用,也可以直接被客户端调用。

二、例子

需求:

实现一个登录帐户的功能,登录分为验证码验证、连接服务器、从数据库匹配帐户和密码的三个主要步骤。

c 复制代码
//SubSystem:子系统(服务器)
    public class Server
    {
        public void SocketToServer()
        {
            Console.WriteLine("连接服务器。");
        }
    }

    //SubSystem:子系统(验证码)
    public class VeriCode
    {
        public bool doVeriCode(string code)
        {
            Console.WriteLine("{0}验证成功!", code);
            return true;
        }
    }

    //SubSystem:子系统(数据库)
    public class Database
    {
        //假设这个字典所存的数据是来自数据库里的。
        private Dictionary<int, string> UserInfos = new Dictionary<int, string>()
        {
           {123,"abc" },
           {456,"xyz" },
           {789,"abc123"},
        };

        //是否跟数据库里的信息匹配
        public bool isExist(int userId, string pwd)
        {
            bool isExist = UserInfos.Contains(new KeyValuePair<int, string>(userId, pwd));
            return isExist;
        }

    }

    //Facade:外观(登录)
    public class LogOnFacade
    {
        private Server server;
        private VeriCode veriCode;
        private Database database;
        public LogOnFacade()
        {
            server = new Server();
            veriCode = new VeriCode();
            database = new Database();
        }

        public bool IsCode(string code)
        {
            return veriCode.doVeriCode(code);
        }

        public bool LogOnUser(int userId,string pwd)
        {
            server.SocketToServer();
           return database.isExist(userId, pwd);
        }

    }

    //主程序
    class Program
    {
        static void Main(string[] args)
        {
            LogOnFacade logOn = new LogOnFacade();

            logOn.IsCode("qwe1");
            var isSuccess = logOn.LogOnUser(123, "abc");

            var result = isSuccess ? "登录成功" : "登录失败";
            Console.WriteLine(result);

            Console.ReadLine();
        }
    }
相关推荐
oradh12 小时前
Oracle 执行计划的阅读方法(二叉树结构来理解和阅读)
数据库·oracle·执行计划的阅读方法
sarasuki12 小时前
为什么 Agent 工具需要一个「协议」而不是「框架」:MCP 成为标准的底层逻辑
设计模式·agent·mcp
vivo互联网技术12 小时前
知识不是文件,也不是向量 | KDC 系列 02
人工智能·设计模式·架构
lbb 小魔仙6 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
Zane19946 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
小刘在重生~6 天前
Oracle_day2 单行函数|组函数|分组|伪列|子查询|分页|多表连接
笔记·oracle·面试
NineData6 天前
NineData 与统信服务器操作系统完成兼容认证
数据库·oracle·操作系统·软件·数据库管理工具·ninedata·统信
山岚的运维笔记7 天前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
geovindu7 天前
sql: Transaction & Concurrency Patterns using Oracel 21c
oracle·数据库开发·数据库架构
怕浪猫7 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员