zoukankan      html  css  js  c++  java
  • 什么是接口(入门篇)——使你的程序功能丰富

    重复劳动

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

    初始开发起来,肯定很轻松,在界面上放置一个按钮,给它一个名字,然后到他的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行是追加的代码

    测试

    结尾

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

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

  • 相关阅读:
    Android自定义权限和使用权限
    SendInput模拟Win(VK_LWIN)键的问题
    难以置信,根本就没拖延症!
    Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类
    Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector
    Android ViewPager Fragment使用懒加载提升性能
    Android快捷便利但不常被使用的原生工具类
    Android TextView图文混合编排
    JQuery中$.ajax()方法参数详解 及 async属性说明
    jQuery.ajaxComplete() 函数详解
  • 原文地址:https://www.cnblogs.com/ShimizuShiori/p/4911049.html
Copyright © 2011-2022 走看看