在设计程序的许多应用场景中我们会遇到大体分为三个阶段的任务流。

第一、入口

一个或多个入口,等待阻塞的、或者主动请求方式的。

==============================

比如任务流需要接受来自于 HTTP 和 FTP 的应用请求,后续还有可能增加别的方式的接受请求。

第二、处理

多个入口可以对应一个处理程序,也可以对应多个处理程序。

==================================

比如 HTTP 和 FTP 的多个入口程序需要对应一个和多个处理逻辑,同样也面临着增加处理程序的扩展性问题。

第三、出口

多个处理程序或者一个处理程序对应多个出口或者一个出口。

==================================

比如报警方式有邮件报警、微信报警等等,后续还有可能增加短信报警等等。

事实上可以把绝大部分需求可以抽象成上述思维。

那么对于这类问题我们采取的扩展性要求是,拓展功能时改动少量原有代码或者干脆不改动原有代码。在不考虑软件重构层面,当新入职员工接手上位大哥的代码时,我想最头疼的就是增加需求,因为你不知道更改代码会带来什么隐藏 BUG。

我们总是理想可以用"插件化"的思想来适应需求,写好框架,然后分门别类,每一个抽象出来的角色是一个大的容器,然后每次向这个容器中插一个个的插件,来一个需求,做一个插件插进去。来两个需求,做两个插件插一双进去。

更"过分"的要求是插进去插件必须有一个按钮来控制是不是启用该插件,理由就是拔插一次插件太耗时了(对应代码中的注释 N 多行)。

总之一切的一切我们想要的效果就是每一个插件独立工作,互不相应,增加可拓展性。这样带来的弊端就是可能有一部分的冗余代码,但是这样也比交接出去工作让人家天天在背后黑你要强的多吧。

那首先我们先用 golang 来造出一个需求容器。

package need

import (
"fmt"
) var (
Plugins map[string]Need
) func init() {
Plugins = make(map[string]Need)
} type Need interface {
Flag() bool // 必须告诉容器是否启动
Start() //必须有启动方法
} func Start() {
for name, plugin := range Plugins {
if plugin.Flag() {
go plugin.Start()
fmt.Printf("启动插件%s\n", name)
} else {
fmt.Printf("不启动插件%s\n", name)
}
}
} //每个插件在初始化时必须注册
func Register(name string, plugin Need) {
Plugins[name] = plugin
}

  

这个需求容器对插入自己的插件有要求!

  1. 必须告诉容器插件本身是不是正常的
  2. 必须提供你插件本身的工作内容
  3. 必须与容器进行连接

如果缺少 1,那么就无法实现插件生病就放病假。

如果缺少 2,你说你不说你是干啥的容器怎么敢收你,万一是贩毒的咋办~

如果缺少 3,得与容器签订合同,绑定劳动关系。

按照上述要求,我们来实现一个插件一号。

package node

import (
"fmt"
"go_dev/plugin/need"
) func init() {
p1 := plugin1{}
need.Register("plugin1", p1)
} type plugin1 struct {
} func (p plugin1) Flag() bool {
return true
} func (p plugin1) Start() {
fmt.Println("我是插件一号")
}

  

现在是容器也有了,插件也有了,但是没电跑不起来啊。。。,我们现在再用 golang 给他提供个电源。

package main

import (
"go_dev/plugin/need"
_ "go_dev/plugin/node"
) func main() {
need.Start()
}

  

go interface衍生的插件化处理的更多相关文章

  1. Android架构设计之插件化、组件化

    如今移动app市场已经是百花齐放,其中有不乏有很多大型公司.巨型公司都是通过app创业发展起来的:app类型更加丰富,有电子商务.有视频.有社交.有工具等等,基本上涵盖了各行各业每个角落,为了更加具有 ...

  2. Winform开发框架之插件化应用框架实现

    支持插件化应用的开发框架能给程序带来无穷的生命力,也是目前很多系统.程序追求的重要方向之一,插件化的模块,在遵循一定的接口标准的基础上,可以实现快速集成,也就是所谓的热插拔操作,可以无限对已经开发好系 ...

  3. 如何写一个c++插件化系统

    1.为什么需要插件化系统 “编程就是构建一个一个自己的小积木, 然后用自己的小积木搭建大系统”. 但是程序还是会比积木要复杂, 我们的系统必须要保证小积木能搭建出大的系统(必须能被组合),有必须能使各 ...

  4. iOS插件化研究之中的一个——JavaScriptCore

    原文:p=191">http://chentoo.com/?p=191 一.前言 一样的开篇问题,为什么要研究这个?iOS为什么要插件化?为什么要借助其它语言比方html5 js甚至脚 ...

  5. Android插件化开发---执行未安装apk中的Service

    欢迎各位增加我的Android开发群[257053751​] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...

  6. 小白也能看懂插件化DroidPlugin原理(一)-- 动态代理

    前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...

  7. 小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

    前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代 ...

  8. Android动态加载技术(插件化技术)

    No1: 插件化技术的好处: 1)减轻应用的内存和CPU占用 2)实现热插拔,即在不发布新版本的情况下更新某些模块 No2: 插件化方案必须要解决三个基础性问题:资源访问.Activity生命周期的管 ...

  9. Android插件化的兼容性(中):Android P的适配

    Android系统的每次版本升级,都会对原有代码进行重构,这就为插件化带来了麻烦. Android P对插件化的影响,主要体现在两方面,一是它重构了H类中Activity相关的逻辑,另一个是它重构了I ...

随机推荐

  1. centos7.3nginx启动命令

    #!/bin/sh # chkconfig: 2345 80 90 # description: Start and Stop nginx #PATH=/usr/local/sbin:/usr/loc ...

  2. Android 上传开源项目到 jcenter 实战踩坑之路

    本文微信公众号「AndroidTraveler」首发. 背景 其实 Android 上传开源项目到 jcenter 并不是一件新鲜事,网上也有很多文章. 包括我本人在将开源项目上传到 jcenter ...

  3. 用kubeadm创建高可用kubernetes集群后,如何重新添加控制平面

    集群信息 集群版本:1.13.1 3个控制平面,2个worker节点 k8s-001:10.0.3.4 k8s-002:10.0.3.5 k8s-003:10.0.3.6 k8s-004:10.0.3 ...

  4. Jpa 笔记

    ORM 思想 对象关系映射, 建立实体类和表的关系映射关系, 实体类和表中字段的映射关系,我们操作实体类底层是操作数据表, 进而自动的拼接出SQL语句 Jpa规范 Jpa(Java Persisten ...

  5. springboot与springcloud的关系

    1 . 问题描述 随着springboot.springcloud的不断迭代升级,开发效率不断提升,越来越多的开发团队加入到spring的大军中,今天用通俗的语言,介绍下什么是springboot,s ...

  6. Java编程思想:擦除的神秘之处

    import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; public class Test ...

  7. c++小游戏:洛谷彩票

    #include <cstdlib> #include <iostream> #include <cstdio> #include <cmath> #i ...

  8. 个人永久性免费-Excel催化剂功能第81波-指定单元格区域内容及公式填充

    在日常数据处理过程中,需要对缺失数据进行填充时,按一定逻辑规则进行处理,实现快速填充,规范数据源.此篇给大家带来多种填充数据的场景. 业务使用场景 对各种系统中导出的数据,很多时候存在数据缺失的情况, ...

  9. Excel催化剂开源第12波-VSTO开发遍历功能区所有菜单按钮及自定义函数清单

    在插件开发过程中,随着功能越来越多,用户找寻功能入口将变得越来越困难,在Excel催化剂 ,将采用遍历所有功能的方式,让用户可以轻松使用简单的查找功能找到想要功能所在位置,查找的范围有:功能按钮的显示 ...

  10. JQuery开始

    JQuery jq的选择器 等等(网页的连接:http://www.runoob.com/jquery/jquery-ref-selectors.html) 事件: hover中有俩参数(mousee ...