什么是接口(入门篇)——使你的程序功能丰富

重复劳动

在一个主项目中,经常会放置多个子功能的入口,这些入口有可能是按钮,有可能是下拉菜单。

初始开发起来,肯定很轻松,在界面上放置一个按钮,给它一个名字,然后到他的Click事件中编写一段代码,让子功能的界面弹出。

但是随着子功能的不断变多,这个毫不起眼的几个小工作,我们在不停重复的进行。

最头疼的是,突然有一天,你的PM跟你说,这个界面不要了,或者是这个子功能的入口换成另一个窗体的时候,你已经不记得这不起眼的几行代码在哪里了。

问题出在哪?

这样的设计模式,也是初学者最容易走的开发方式。

我们从逻辑上来分析,功能模块应该是由其自身决定在界面上显示什么内容,自己应该以何种方式被打开。

想象一下我们的Windows操作系统,每一个程序的图标,以及图标上的文字,都应当由程序各自来决定,而不是操作系统,只有这样,这些图标、文字、甚至于其存在,都可以轻松得进行修改。

使用接口将属于"子功能"的功能还给"子功能"

我们可以模仿Windows的做法,比如图标啦、文字啦、以及打开后"要做什么事",这些东西全部做成一个接口

 1 /// <summary>
 2 /// 定义一个接口,用于描述一个子功能模块
 3 /// </summary>
 4 public interface ISubMoudle
 5 {
 6     /// <summary>
 7     /// 功能名称
 8     /// </summary>
 9     string ModuleName { get; }
10
11     /// <summary>
12     /// 图标文件的路径,若不使用图标,则返回空字符或null
13     /// </summary>
14     string ICONPath { get; }
15
16     /// <summary>
17     /// 打开这个功能模块
18     /// </summary>
19     void Open();
20 }

我们以后制作的所有子功能模块都实现该接口,举个例子

 1 /// <summary>
 2 /// 一个显示当前时间的子功能
 3 /// </summary>
 4 public class ShowTimeMoudle :ISubMoudle
 5 {
 6
 7     public string ModuleName
 8     {
 9         get { return "显示时间"; }
10     }
11
12     public string ICONPath
13     {
14         get { return ""; }
15     }
16
17     public void Open()
18     {
19         Console.WriteLine(DateTime.Now.ToString());
20     }
21 }

功能内的主要内容,都在Open方法中体显。

使用子功能

子功能已经定义好了

让我们来赶紧使用它吧

首先,要主功能模块中,我们要有一个列表

列表中详细地记录了所有的ISubMoudle对像

然后,我们动态地,将这些内容输出到一个窗体、一个控制台或一个Web中去,我们以控制台为例

 1         static void Main(string[] args)
 2         {
 3             List<ISubMoudle> moudleList = new List<ISubMoudle>();
 4             moudleList.Add(new ShowTimeMoudle());
 5
 6             //开始将moudleList中的所有功能开始输出
 7             for (int i = 0; i < moudleList.Count; i++)
 8             {
 9                 Console.WriteLine("{0} : {1}", i + 1, moudleList[i].ModuleName);
10             }
11
12             Console.ReadLine();
13         }

进入子功能

子功能已经动态地显示出来了,我们准备使用前面对应的数字,进行各个自功能。

其实就是,我们分析录入的字符,转化为数字类型,在moudleList中对找对应的位置,然后调用其Open()方法

 1             List<ISubMoudle> moudleList = new List<ISubMoudle>();
 2             moudleList.Add(new ShowTimeMoudle());
 3
 4             //开始将moudleList中的所有功能开始输出
 5             for (int i = 0; i < moudleList.Count; i++)
 6             {
 7                 Console.WriteLine("{0} : {1}", i + 1, moudleList[i].ModuleName);
 8             }
 9
10             string cmd = Console.ReadLine();
11             int j = int.Parse(cmd);
12             ISubMoudle moudle = moudleList[j - 1];
13             moudle.Open();
14
15             Console.ReadLine();

10 - 13行是追加的代码

测试

结尾

以上,就是演示了接口的另一种用法 : 动态地扩展你的程序,将你开发的关注点仅仅放在功能模块内部

在这里,我们以运行时的方式,将所有的子模块输出到了控制台界面上:

时间: 2024-10-09 16:41:44

什么是接口(入门篇)——使你的程序功能丰富的相关文章

Git入门篇之环境搭建&基本功能的使用

网上关于GitHub的使用教程还是比较丰富,不过部分教程比较陈旧抑或写得不够详细,在我实践的过程中遇到了一些麻烦,记录下来,当是自己的一个总结吧,也供大家参考.欢迎留言交流. 本文主要讲解Windows Msysgit软件平台的使用,windows的GitHub for Windows方式和苹果系统的Github或git方式也在用,这方面网上的教程比较丰富,也就不做过多阐述了,欢迎留言讨论. Windows版本: 在windows中搭建Git环境使用Github有两种方式: 方式一: GitHu

【入门篇】Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布

http://blog.csdn.net/allenlinrui/article/details/19419721 1.介绍 Nginx - 高性能web server,这个不用多说了,大家都知道. FastCGI程序 - 常驻型CGI程序,它是语言无关的.可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能. Nginx要调用FastCGI程序,需要用到FastCGI进程管理程序(因为nginx不能直接执行外部的cgi程序,我们可使用lighttpd中的s

28-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(官方API版,非RTOS版)

https://www.cnblogs.com/yangfengwu/p/11432795.html 注:这节实现的功能是WIFI模块作为TCP 客户端,连接咱的TCP服务器,然后实现透传 本来想着做成断线重连,但是无论如何测试,使用官方给的API默认大约2个小时以后就会主动断开连接...... 其实和咱 https://www.cnblogs.com/yangfengwu/p/11112014.html  (TCP 服务器差不多) 先看下程序测试 (连接路由器测试,让电脑和WIFI连接同一个路

Vue学习笔记入门篇——组件的通讯

本文为转载,原文:Vue学习笔记入门篇--组件的通讯 组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B.它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件.然而,在一个良好定义的接口中尽可能将父子组件解耦是很重要的.这保证了每个组件可以在相对隔离的环境中书写和理解,也大幅提高了组件的可维护性和可重用性.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props 向下传递

新注册第一帖----------------------乱码新手自学.net 之Linq 入门篇

作为一个业余开发,断断续续学.net/c#也有不少日子了, 学习过程中,不断忘了学,学了忘,这让我很苦恼. 以前学习过程中,我总是在笔记本中记录下来知识要点,这么久下来,笔记本都写了四五本了. 然而,随着笔记本的增多,自己很快发现,笔记写了跟没写一样:笔记多了就找不到了-- 所以,我觉得还是上博客园写博客,记录自己每天的学习心得. 如果有什么错误的地方,欢迎大神指教,小弟在这给大神跪谢了 ======================================================

storm学习之入门篇(一)

海量数据处理使用的大多是鼎鼎大名的hadoop或者hive,作为一个批处理系统,hadoop以其吞吐量大.自动容错等优点,在海量数据处理上得到了广泛的使用.但是,hadoop不擅长实时计算,因为它天然就是为批处理而生的,这也是业界一致的共识.否则最近这两年也不会有s4,storm,puma这些实时计算系统如雨后春笋般冒出来.先抛开s4,storm,puma这些系统不谈,我们首先来看一下,如果让我们自己设计一个实时计算系统,我们要解决哪些问题: 1.低延迟.都说了是实时计算系统了,延迟是一定要低的

PC游戏编程(入门篇)(前言写的很不错)

PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 2.3 进入图形世界的钥匙--GAFDDraw 2.4 2D图像的本质--图层表面 2.5 场景的秘密--背景卷动 2.6 诱惑--来自"精灵"的问候 2.7 餐后甜点--GAFApp/GAFDDraw的其他法宝 第三章 塞壬的歌声魔力和第三类接触 3.1 1,2,3--计算机音乐概述

spring 入门篇

spring 入门篇 相对于Hibernate(冬眠),Spring(春天),具有更多的诗意与希望的感觉,是为了解决传统J2EE开发效率过低.开发商之间不统一.没有真正实现“写一次到处使用”,它的优点有如下: 低侵入式设计,代码污染极低. 独立于各种应用服务,真正实现写一次到处都可以使用. 用户可选择的自由度高,用户可以选择部分或者是全部SPRING的功能,它并不是设计来取代其它框架,可以和其它的框架(如STRUTS.HIBERNATE)等结合极好. 面向接口的编程方式,使得代码的偶合度降到最低

【Android的从零单排开发日记】之入门篇(八)——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S