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

第一、入口

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

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

比如任务流需要接受来自于 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. 统计学习方法9—EM算法

      EM算法是一种迭代算法,是一种用于计算包含隐变量概率模型的最大似然估计方法,或极大后验概率.EM即expectation maximization,期望最大化算法. 1. 极大似然估计   在概率 ...

  2. 并发编程-concurrent指南-Lock-可重入锁(ReentrantLock)

    可重入和不可重入的概念是这样的:当一个线程获得了当前实例的锁,并进入方法A,这个线程在没有释放这把锁的时候,能否再次进入方法A呢? 可重入锁:可以再次进入方法A,就是说在释放锁前此线程可以再次进入方法 ...

  3. MVC模式的介绍(C#)

    MVC模式的介绍(C#)   Benefits在开发项目中使用“模型-视图-控制器(MVC)”模式的好处在于可以完全消除商业流程和应用表达层之间的相互影响.此外,还可以获得一个完全独立的对象来控制表达 ...

  4. SFC20 功能例子 注解

    谁能够把这注解一下,给大家分享一下,谢谢了 LAR1  P##SOURCE       L     B#16#10       T     LB [AR1,P#0.0]       L     B#1 ...

  5. windows软件卸载工具Geek Uninstaller免安装版

    曾经一个问题一直困扰这我,就是每次在卸载软件的时候都卸载不干净,卸载完后会有遗留文件夹,每次都要手动删,还有注册表也不干净,让我很是难受,直到有一天发现了一个卸载神器Geek Uninstaller ...

  6. Android native进程间通信实例-socket本地通信篇之——基本通信功能

    导读: 网上看了很多篇有关socket本地通信的示例,很多都是调通服务端和客户端通信功能后就没有下文了,不太实用,真正开发中遇到的问题以及程序稳定性部分没有涉及,代码健壮性不够,本系列(socket本 ...

  7. php常用实用函数整理

    1.PHP加密解密 PHP加密和解密函数可以用来加密一些有用的字符串存放在数据库里,并且通过可逆解密字符串,该函数使用了base64和MD5加密和解密. function encryptDecrypt ...

  8. 万字长文:ELK(V7)部署与架构分析

    ELK(7版本)部署与架构分析 1.ELK的背景介绍与应用场景 在项目应用运行的过程中,往往会产生大量的日志,我们往往需要根据日志来定位分析我们的服务器项目运行情况与BUG产生位置.一般情况下直接在日 ...

  9. JavaScript知识点---->运算规则与运算(逻辑、位)

    *在js中不同类型之间的运算,所得到结果的类型也会有所变化: string + number = string string + boolean = string string + undefiend ...

  10. 巧力避免ViewPager的预加载数据,Tablayout+Fragment+viewPager

    问题描述 最近在进行一个项目的开发,其中使用到了Tablayout+Fragment+viewPager来搭建一个基本的框架,从而出现了设置数据适配器的时候,item的位置错乱问题.我打印log日志的 ...