框架framework的目的是定义骨架式方案,处理各种相同的底层细节;而开发人员使用框架时,能够依照自己的需求实现自己的功能——仅仅须要填入自己的东西/flesh。

最简单的框架,类似于JUnit,它有一个main(String[] args)启动本框架。假设是applet或GUI框架,就有太多底层细节须要处理。

package principle.callback.lower;
/**
* 最简单的Java框架
*
* @author yqj2065
* @version 2014.10
*/
public interface MyFramework{
public double op(double m,double n);
}

最简单的框架就是一个函数接口lower.MyFramework,它对两个double操作后返回一个double值。

package principle.callback.lower;
import tool.God;
public class Main{
/**
* 命令行启动本框架。
* @param args 至少两个double
*/
public static void main(String[] args){
MyFramework f = (MyFramework)God.create("2065");
double d =f.op(Double.parseDouble(args[0]),Double.parseDouble(args[1]));
System.out.println(d);
}
/**
* 和JUnit一样,提供App调用的方式。
*/
public static double runFramework(MyFramework f,double x,double y){
return f.op(x,y);
}
}

注意,框架一般使用的技术就是反射和回调

  • tool.God利用反射和配置文件创建某个对象,
  • Main调用f.op(double,double),详细的方法体由上层代码提供。

ok,框架已经设计完毕。


如今是我们应用程序猿干活的时候了。

应用程序猿最開始当然写HelloWorld,来熟悉框架...HelloWorld不可以和高傲的框架在一个包中。

package principle.callback;
public class HelloWorld implements principle.callback.lower.MyFramework{
public double op(double m,double n){
return m+n;
}
}

应用程序猿还要依照框架的要求,自己写好配置文件。假设框架的文档说明:须要在my.properties中定义要创建的对象,于是我们在my.properties中加上:

2065=principle.callback.HelloWorld

接下来在命令行中执行框架,比如:

E:\designPattern>java principle.callback.lower.Main 1.2 3.4

4.6

有时候,我们应用程序猿在应用程序中启动或调用框架,也能够:

package principle.callback;
import tool.God;
import principle.callback.lower.MyFramework;
import principle.callback.lower.Main;
public class App{
public static void main(String[] args){
MyFramework f = (MyFramework)God.create("2065");
double d = Main.runFramework(f,1.2,3.4);
System.out.println(d);
}
}

当然,设计App的程序猿和设计HelloWorld的程序猿同病相怜,自己人就不用反射了:

    public static void test(){
double d = Main.runFramework(new HelloWorld(),1,3);
System.out.println(d); MyFramework f = (double m,double n)->{return m * n ;};
d = Main.runFramework(f,1,3);
System.out.println(d); f = (m,n)->{return m +2*n ;};
d = Main.runFramework(f,1,3);
System.out.println(d);
}

输出:

4.0

3.0

7.0

回调使得编写上层模块的程序猿有了新的体验——填空式编程

这就有了库与框架的差别——上层模块的程序猿直接调用的,属于库函数;要求上层模块的程序猿提供的回调函数的,属于框架。

假设我们通吃上层和下层,设计框架时使用回调机制;假设我们让愚蠢的应用程序猿填空,哈哈,我们告诉他们一个术语——控制反转。

假设我们是框架的应用程序猿,...好吧,我们也设计一个框架,控制反转。

最简单的Java框架的更多相关文章

  1. AsMVC:一个简单的MVC框架的Java实现

    当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍sp ...

  2. 分布式架构的基石.简单的 RPC 框架实现(JAVA)

    前言 RPC 的全称是 Remote Procedure Call,它是一种进程间通信方式.允许像调用本地服务一样调用远程服务. 学习来源:<分布式系统架构:原理与实践> - 李林锋 1. ...

  3. Java实现简单的RPC框架(美团面试)

    一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...

  4. Java框架介绍-13个不容错过的框架项目

    本文转自互联网,个人收藏所用. 下面,我们将一同分享各有趣且颇为实用的Java库,大家请任取所需.不用客气~ 1.极致精简的Java Bootique是一项用于构建无容器可运行Java应用的极简技术. ...

  5. Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(二)

    然后是项目下的文件:完整的项目请看  上一篇 Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一) 项目下的springmvc-servlet.xml配置文件: ...

  6. 对java框架的几点认识

    java框架实在是太多了,网上一抄一大段,根本就了解不到什么.我还是以我的经验来说一下j2ee的框架.1.首先力推struts2框架,这是最经典的框架(可以说没有“之一”).可以帮你快速搭建出一个MV ...

  7. 2016年7款最流行的Java框架

    虽然Java一直被唱衰,但是直到现在Java也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,所以我们为大家搜集了一些目前比较受欢迎的Java框架的消息. 根据RebelLabs对在 ...

  8. 简单聊聊java中的final关键字

    简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...

  9. 简单实现springmvc框架(servlet+自定义注解)

    个人水平比较菜,没有这么高的实力简单实现springmvc框架,我是看了一个老哥的博客,这老哥才是大神! 原文链接:https://www.cnblogs.com/xdp-gacl/p/4101727 ...

随机推荐

  1. iTextSharp使用字体设置摘录

    用iTextSharp做pdf转换的时候,需要添加水印.文字水印的时候,需要设置字体,查了下文档.摘录下解决方案. iText中输出中文,有三种方式: 1.使用iTextAsian.jar中的字体   ...

  2. Mac Eclipse+Maven+TestNg+ReportNg 生成测试报告

    TestNG 是java 的单元测试框架,功能很强大,很方便,但是自动生成的测试报告有待改善,可以使用TestNg 自带的TestNG_xslt更改TestNG报告的样式,这里主要讲解ReportNg ...

  3. c/c++ 动态申请数组

    new和delete运算符用于动态分配和撤销内存的运算符 new使用方法: 1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.in ...

  4. HDU 4876 ZCC loves cards _(:зゝ∠)_ 随机输出保平安

    GG,,,g艹 #include <cstdio> #include <iostream> #include <algorithm> #include <st ...

  5. Swift - AnyObject与Any的区别

    1,AnyObject :代表任何class类型的对象实例. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Man{ }   class Woman{ ...

  6. Unable to instantiate activity ComponentInfo或java.lang.ClassNotFoundException: com.ibright.herolegen

    不知道怎么回事,在libs中添加了jar包后,无法给jar包附加上源码,于是采取以下措施: 删除自动生成的依赖: 在Android Dependences目录上右击->Build Path -& ...

  7. json转String 和 String转json 和判断对象类型

    function ajaxGetMenuList(){ $.getJSON("login.do", function(json){ var r = ""; zN ...

  8. A*寻路算法的实现

    原理:http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html 算法理论请到原理这个传送门,代码中的注释,已经比较详细,所以我不会讲 ...

  9. 14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量

    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量 InnoDB 使用bac ...

  10. BAD packet signature 18245 错误解决

    1.错误信息 2014-7-15 2:46:38 org.apache.jk.common.MsgAjp processHeader 严重: BAD packet signature 18245 20 ...