精华内容
下载资源
问答
  • 本课程主要讲述Android开发Java的基础核心的学习,包括:变量、操作符和表达式、语句、数组、类的方法、访问控制与封装、继承、常见工具类、链表、实际操作综合示例。课程由浅深,实用性强。
  • WEB前端简历模板

    万次阅读 多人点赞 2019-10-15 17:15:36
    WEB前端简历模板 详细资料 姓名:XXX 出生年月:XXXX年X月 名 族:X族 政治面貌:XXXX ...

    WEB前端简历模板

    详细资料

                 姓名:XXX  出生年月:XXXX年X月                                            
    
                     名 族:X族                                 政治面貌:XXXX                                                       
    
                     Q Q:1000000000                      联系电话:110110110110                                             
    
                     E-Mail:xxx@163.com           博客:http://xxx.com
    

    教育背景

                       时间:20XX/0X----20XX/0X                                          学校:XXXX大学
    
                       专业:XXXX                                                             学历:本科
    
                       主修课程:XXXXXXXXXXXXXXXXXXXXXXXX
    
                       获得奖励:XX一等奖、XX国家奖学金
    
                       在校经历:(1)XXX  (2)XXXXXXX     (3)XXXXXXXX
    

    技能特长

    1.精通DIV+CSS布局的HTML代码编写,熟练手写符合W3C标准的代码,能够根据交互原型和UI设计图完整制作出网页;

    2.熟悉Javascript、css3和html5,且能熟练运用JQuery框架实现网页常用特效,掌握面向对象编程思想;

    3.熟练应用dom、xml、json等相关技术;

    4.熟悉Bootstrap前端框架,了解Nodejs和Angularjs以及less,sass、git、github等技术和团队协作开发工具;

    5.具备抗压能力、且有一定自学能力,能够熟练阅读使用中文API,英文API可以大概看懂并运用;

    6.担任项目组长并组织团队开发过电商、企业和移动端网站前端项目;

    工作经历

      (20XX.6-20XX.8)   XXXXXXXX有限公司                            实习生
    

    1、设置地区网络架构(办公楼、园区)

    2、配置网络路由器协议(RIP、OSPF)

    3、进行真机操作配置

      (20XX.7-20XX.11)  XXXXXX公司                                       实习生
    

    1、参与多个不同项目的前端开发工作:包括企业站、电商网站、个人博客、移动端网站等;

    2、参与讨论项目分工和编写工作计划;

    3、根据项目需求开发项目前端页面,还原效果图,将psd文件写出html页面,并适应各主流浏览器;

    4、使用js、jq、h5和c3实现页面特效,并解决特效兼容性问题;

    5、使用浏览器Firebug工具进行页面调试解决BUG;

    6、编写项目开发总结,把错误和解决方案,兼容性问题如何解决写成文档。

    项目经验

    项目一、XXXXXX

    开发环境:Window7、chrome、360浏览器、ie、firefox

    开发工具:HBuilder、photoshop、Adobe Dreamweaver

    项目描述:雷锋网是深圳英鹏信息技术有限公司于2011年创办,从起始的科技博客,逐步发展成一个科技信息与产品服务平台。雷锋网拥有三大业务单元,深入移动互联网与智能硬件行业,为厂商及用户提供了涵盖媒体资讯、社会化传播、产品改进和预售等多元系统服务。在智能硬件领域,雷锋网已当之无愧处于领先媒体。

    责任描述:

    1、按照psd文档内容切好图片,准备布局;

    2、使用html、css完成网页布局;

    3、进一步使用H5和CSS3进行页面效果优化;

    4、检查代码,测试兼容性,修复bug;

    5、总结并提交开发文档。

    项目二、XXXXX

    开发环境:Window7、chrome、360浏览器、ie、firefox

    开发工具:HBuilder、photoshop、WampServer、Adobe Dreamweaver

    项目描述:联东集团,创立于1991年。经过二十多年的发展,形成了集产业园区运营、金融投资和模板钢结构为一体的集团化企业。产业园区作为联东集团主 要业务板块,独创聚合U模式,以”联东U谷”为品牌,成功进驻北京、上海、天津、重庆、沈阳、济南、青岛、无锡、南京、苏州、杭州、合肥、郑州、成都等二十 多座城市,产业园区项目已达六十多个,入园企业4000多家,是目前国内规模最大、产品系列最全、入住客户最多、运营体系最完善的产业园区专业运营商。

    责任描述:

    1、根据项目做出个人开发计划,搭建开发环境进行项目开发;

    2、使用DIV+CSS布局模式完成网页布局;

    3、使用原生js写出网页各种特效;

    4、添加公共部分,整理代码,完成页面优化;

    5、处理兼容性问题,使用浏览器Firebug工具查询bug并进行修复;

    6、总结并提交开发文档。

    项目三、XXXX

    开发环境:Window7、chrome、360浏览器、ie、firefox

    开发工具:HBuilder、photoshop、WampServer、Adobe Dreamweaver

    项目描述:小米官网是小米科技有限公司的官方网站,小米是一家专注于高端智能手机自主研发的移动互联网公司,由雷军组建。已获得来自Morningside、启 明、IDG和小米团队4100万美元投资,其中小米团队56人投资1100万美元,公司估值400亿美元。其他核心产品有:基于Android深度开发的第三方操作系统 MIUI,智能手机即时通讯工具米聊,小米电视,和小米盒子,小米手机、MIUI、米聊是小米公司旗下三大核心业务。

    责任描述:

    1、整理整个项目内容,分配工作,给出公共部分样式代码;

    2、使用DIV+CSS布局模式完成网页布局;

    3、进一步使用H5和CSS3进行页面效果优化;

    4、使用原生js和JQuery框架写出网页各种特效;

    5、对各大主流浏览器进行兼容性处理,查询bug并进行修复;

    6、总结并提交开发文档。

    展开全文
  • 源码分析模板方法模式的典型应用 Servlet 中的模板方法模式 Mybatis BaseExecutor接口中的模板方法模式 模板方法模式 在程序开发中,经常会遇到这种情况:某个方法要实现的算法需要多个步骤,但其中有一些步骤是...

    本文的主要内容:

    • 介绍模板方法模式
    • 源码分析模板方法模式的典型应用
      • Servlet 中的模板方法模式
      • Mybatis BaseExecutor接口中的模板方法模式

    模板方法模式

    在程序开发中,经常会遇到这种情况:某个方法要实现的算法需要多个步骤,但其中有一些步骤是固定不变的,而另一些步骤则是不固定的。为了提高代码的可扩展性和可维护性,模板方法模式在这种场景下就派上了用场。

    譬如制作一节网课的步骤可以简化为4个步骤:

    1. 制作PPT
    2. 录制视频
    3. 编写笔记
    4. 提供课程资料

    其中1、2、3的动作在所有课程中的固定不变的,步骤3可有可无,步骤4在每个课程都不同(有些课程需要提供源代码,有些需要提供图片文件等)

    我们可以在父类中确定整个流程的循序,并实现固定不变的步骤,而把不固定的步骤留给子类实现。甚至可以通过一个钩子方法,让子类来决定流程中某个方法的执行与否

    示例.模板方法模式

    模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。

    角色

    AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。

    ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

    一个模板方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个模板方法定义在抽象类中,并由子类不加以修改地完全继承下来。模板方法是一个具体方法,它给出了一个顶层逻辑框架,而逻辑的组成步骤在抽象类中可以是具体方法,也可以是抽象方法。

    基本方法是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

    • 抽象方法:一个抽象方法由抽象类声明、由其具体子类实现。
    • 具体方法:一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。
    • 钩子方法:可以与一些具体步骤 “挂钩” ,以实现在不同条件下执行模板方法中的不同步骤

    示例

    所以我们通过模板方法模式,在抽象类中把整个流程固定下来,其中1、2、3的实现在抽象类中完成,3的执行与否则由子类通过钩子方法来控制,4则由子类来实现

    抽象类定义如下:

    public abstract class ACourse {
    
        protected final void makeCourse() {
            this.makePPT();
            this.makeVideo();
            if (needWriteArticle()) {
                this.writeArticle();
            }
            this.packageCourse();
        }
    
        final void makePPT() {
            System.out.println("1. 制作PPT");
        }
    
        final void makeVideo() {
            System.out.println("2. 制作视频");
        }
    
        final void writeArticle() {
            System.out.println("3. 编写课程笔记");
        }
    
        //钩子方法
        protected boolean needWriteArticle() {
            return false;
        }
    
        abstract void packageCourse();
    }
    

    其中的 makeCourse 方法是模板方法,它定义了制作网课的基本流程,makePPTmakeVideowriteArticle 这三个步骤在所有课程中都是固定的,所以用 final 关键字修饰;packageCourse 方法在所有课程中都可能不一样,所以声明为抽象方法,由子类自行实现;钩子方法 needWriteArticle 返回一个 boolean 类型的值,控制是否编写课程笔记

    子类 JavaCourse,实现了抽象方法 packageCourse,重写了钩子方法 needWriteArticle

    public class JavaCourse extends ACourse {
        @Override
        void packageCourse() {
            System.out.println("4. 提供Java课程源代码");
        }
    
        @Override
        protected boolean needWriteArticle() {
            return true;
        }
    }
    

    子类 FECourse,实现了抽象方法 packageCourse,重写了钩子方法 needWriteArticle,其中把钩子方法的结果交给客户端确定

    public class FECourse extends ACourse {
        private boolean needWriteArticleFlag = false;
        @Override
        void packageCourse() {
            System.out.println("4.1 提供课程的前端代码");
            System.out.println("4.2 提供课程的图片等多媒体素材");
        }
    
        public FECourse(boolean needWriteArticleFlag) {
            this.needWriteArticleFlag = needWriteArticleFlag;
        }
    
        @Override
        protected boolean needWriteArticle() {
            return this.needWriteArticleFlag;
        }
    }
    

    客户端测试

    public class Test {
        public static void main(String[] args) {
            System.out.println("Java课程start---");
            ACourse javaCourse = new JavaCourse();
            javaCourse.makeCourse();
            System.out.println("Java课程end---\n");
    
    
            System.out.println("前端课程start---");
            ACourse feCourse = new FECourse(false);
            feCourse.makeCourse();
            System.out.println("前端课程end---");
        }
    }
    

    输出结果

    Java课程start---
    1. 制作PPT
    2. 制作视频
    3. 编写笔记
    4. 提供Java课程源代码
    Java课程end---
    
    前端课程start---
    1. 制作PPT
    2. 制作视频
    4.1 提供课程的前端代码
    4.2 提供课程的图片等多媒体素材
    前端课程end---
    

    它们的类图如下

    示例.模板方法模式

    模板方法模式总结

    模板方法模式的主要优点如下:

    • 在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。
    • 模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为,它鼓励我们恰当使用继承来实现代码复用。
    • 可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。
    • 在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。

    模板方法模式的主要缺点如下:

    • 需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象,此时,可结合桥接模式来进行设计。

    适用场景

    • 对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现。即:一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
    • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
    • 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。

    源码分析模板方法模式的典型应用

    Servlet 中的模板方法模式

    Servlet(Server Applet)是Java Servlet的简称,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。在每一个 Servlet 都必须要实现 Servlet 接口,GenericServlet 是个通用的、不特定于任何协议的Servlet,它实现了 Servlet 接口,而 HttpServlet 继承于 GenericServlet,实现了 Servlet 接口,为 Servlet 接口提供了处理HTTP协议的通用实现,所以我们定义的 Servlet 只需要继承 HttpServlet 即可。

    HttpServlet的继承关系

    HttpServlet 的简要代码如下所示

    public abstract class HttpServlet extends GenericServlet {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // ...
        }
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // ...
        }
        protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // ...
        }
        protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // ...
        }
        protected void doDelete(HttpServletRequest req,  HttpServletResponse resp) throws ServletException, IOException {
            // ...
        }
        protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // ...
        }
        protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // ...
        }
        
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String method = req.getMethod();
    
            if (method.equals(METHOD_GET)) {
                long lastModified = getLastModified(req);
                if (lastModified == -1) {
                    // servlet doesn't support if-modified-since, no reason
                    // to go through further expensive logic
                    doGet(req, resp);
                } else {
                    long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                    if (ifModifiedSince < lastModified) {
                        // If the servlet mod time is later, call doGet()
                        // Round down to the nearest second for a proper compare
                        // A ifModifiedSince of -1 will always be less
                        maybeSetLastModified(resp, lastModified);
                        doGet(req, resp);
                    } else {
                        resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                    }
                }
    
            } else if (method.equals(METHOD_HEAD)) {
                long lastModified = getLastModified(req);
                maybeSetLastModified(resp, lastModified);
                doHead(req, resp);
    
            } else if (method.equals(METHOD_POST)) {
                doPost(req, resp);
                
            } else if (method.equals(METHOD_PUT)) {
                doPut(req, resp);
                
            } else if (method.equals(METHOD_DELETE)) {
                doDelete(req, resp);
                
            } else if (method.equals(METHOD_OPTIONS)) {
                doOptions(req,resp);
                
            } else if (method.equals(METHOD_TRACE)) {
                doTrace(req,resp);
                
            } else {
                //
                // Note that this means NO servlet supports whatever
                // method was requested, anywhere on this server.
                //
    
                String errMsg = lStrings.getString("http.method_not_implemented");
                Object[] errArgs = new Object[1];
                errArgs[0] = method;
                errMsg = MessageFormat.format(errMsg, errArgs);
                
                resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
            }
        }
        
        // ...省略...
    }
    

    HttpServletservice 方法中,首先获得到请求的方法名,然后根据方法名调用对应的 doXXX 方法,比如说请求方法为GET,那么就去调用 doGet 方法;请求方法为POST,那么就去调用 doPost 方法

    HttpServlet 相当于定义了一套处理 HTTP 请求的模板;service 方法为模板方法,定义了处理HTTP请求的基本流程;doXXX 等方法为基本方法,根据请求方法做相应的处理,子类可重写这些方法;HttpServletRequest 中的Method则起到钩子方法的作用.

    在开发javaWeb应用时,自定义的Servlet类一般都扩展 HttpServlet 类,譬如我们实现一个输出 Hello World!Servlet 如下

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    // 扩展 HttpServlet 类
    public class HelloWorld extends HttpServlet {
    
      public void init() throws ServletException {
        // ...
      }
    
      public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          response.setContentType("text/html");
          PrintWriter out = response.getWriter();
          out.println("<h1>Hello World!</h1>");
      }
      
      public void destroy() {
          // ...
      }
    }
    

    该自定义的 Servlet 重写了 doGet 方法,当客户端发起 GET 请求时将得到 <h1>Hello World!</h1>

    Mybatis BaseExecutor接口中的模板方法模式

    Executor 是 Mybatis 的核心接口之一,其中定义了数据库操作的基本方法,该接口的代码如下:

    public interface Executor {
    
      ResultHandler NO_RESULT_HANDLER = null;
      // 执行 update、insert、delete 三种类型的SQL语句
      int update(MappedStatement ms, Object parameter) throws SQLException;
      // 执行selete类型的SQL语句,返回值分为结果对象列表或游标对象
      <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException;
      /
      <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException;
    
      <E> Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds) throws SQLException; 
      // 批量执行SQL语句
      List<BatchResult> flushStatements() throws SQLException;
      // 提交事务
      void commit(boolean required) throws SQLException;
      // 回滚事务
      void rollback(boolean required) throws SQLException;
      // 创建缓存中用到的CacheKey对象
      CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql);
      // 根据CacheKey对象查找缓存
      boolean isCached(MappedStatement ms, CacheKey key);
      // 清空一级缓存
      void clearLocalCache();
      // 延迟加载一级缓存中的数据
      void deferLoad(MappedStatement ms, MetaObject resultObject, String property, CacheKey key, Class<?> targetType);
      // 获取事务对象
      Transaction getTransaction();
      // 关闭Executor对象
      void close(boolean forceRollback);
      // 检测Executor是否已关闭
      boolean isClosed();
    
      void setExecutorWrapper(Executor executor);
    
    }
    

    Executor 类的类图如下

    Executor与其子类的类图

    BaseExecutor 中主要提供了缓存管理和事务管理的基本功能,继承 BaseExecutor 的子类只需要实现四个基本方法来完成数据库的相关操作即可,这四个方法分别是:doUpdate() 方法、doQuery() 方法、doQueryCursor() 方法、doFlushStatement() 方法,其余功能都在 BaseExecutor 中实现。

    BaseExecutor的部分代码如下,其中的 query() 方法首先会创建 CacheKey 对象,并根据 CacheKey 对象查找一级缓存,如果缓存命中则返回缓存中记录的结果对象,如果未命中则查询数据库得到结果集,之后将结果集映射成结果对象并保存到一级缓存中,同时返回结果对象。

    public abstract class BaseExecutor implements Executor {
      protected Transaction transaction;
      protected Executor wrapper;
    
      protected ConcurrentLinkedQueue<DeferredLoad> deferredLoads;
      protected PerpetualCache localCache;
      protected PerpetualCache localOutputParameterCache;
      protected Configuration configuration;
    
      protected int queryStack = 0;
      private boolean closed;
      
      @Override
      public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
        ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
        if (closed) {
          throw new ExecutorException("Executor was closed.");
        }
        if (queryStack == 0 && ms.isFlushCacheRequired()) {
          clearLocalCache();
        }
        List<E> list;
        try {
          queryStack++;
          list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
          if (list != null) {
            handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
          } else {
            list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
          }
        } finally {
          queryStack--;
        }
        if (queryStack == 0) {
          for (DeferredLoad deferredLoad : deferredLoads) {
            deferredLoad.load();
          }
          // issue #601
          deferredLoads.clear();
          if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {
            // issue #482
            clearLocalCache();
          }
        }
        return list;
      }
      
      protected abstract int doUpdate(MappedStatement ms, Object parameter)
          throws SQLException;
    
      protected abstract List<BatchResult> doFlushStatements(boolean isRollback)
          throws SQLException;
    
      protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)
          throws SQLException;
    
      protected abstract <E> Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql)
          throws SQLException;
    
      // 省略....
    }
    

    BaseExecutor 的子类有四个分别是 SimpleExecotorReuseExecutorBatchExecutorClosedExecutor,由于这里使用了模板方法模式,一级缓存等固定不变的操作都封装到了 BaseExecutor 中,因此子类就不必再关心一级缓存等操作,只需要专注实现4个基本方法的实现即可。

    这里对这四个子类的功能做一个简要的介绍:

    • SimpleExecutor 是Mybatis执行Mapper语句时默认使用的 Executor,提供最基本的Mapper语句执行功能,没有过多的封装的
    • ReuseExecutor 提供了 Statement 重用的功能,通过 statementMap 字段缓存使用过的 Statement 对象进行重用,可以减少SQL预编译以及创建和销毁 Statement 对象的开销,从而提高性能
    • BatchExecutor 实现了批处理多条SQL语句的功能,在客户端缓存多条SQL并在合适的时机将多条SQL打包发送给数据库执行,从而减少网络方面的开销,提升系统的性能
    • ClosedExecutor 只是某个类的一个内部类

    参考:
    刘伟:设计模式Java版
    慕课网java设计模式精讲 Debug 方式+内存分析
    徐郡明:Mybatis技术内幕 3.6 Executor

    更多内容可访问我的个人博客:http://laijianfeng.org

    关注【小旋锋】微信公众号

    推荐阅读

    设计模式 | 简单工厂模式及典型应用
    设计模式 | 工厂方法模式及典型应用
    设计模式 | 抽象工厂模式及典型应用
    设计模式 | 建造者模式及典型应用
    设计模式 | 原型模式及典型应用
    设计模式 | 外观模式及典型应用
    设计模式 | 装饰者模式及典型应用
    设计模式 | 适配器模式及典型应用
    设计模式 | 享元模式及典型应用
    设计模式 | 组合模式及典型应用

    展开全文
  • 微信小程序框架的制作

    千人学习 2019-01-06 20:13:37
    讲解微信小程序开发所需要准备的注意事项;开发工具的下载;怎么创建和运行第一个微信小程序,以及如何改造;分析微信小程序的目录结构;app.json配置文件的详细分析;实战讲解微信小程序框架的制作!...
  • 2020年20种最佳Android应用程序模板

    千次阅读 2020-06-22 02:51:00
    使用应用模板可以使您更快地满足客户的截止日期,因为所有编程工作都已为您完成。 您需要做的就是根据客户的需求构建应用程序。 CodeCanyon上可用的许多Android应用程序模板之一 CodeCanyon上2020年最畅销的...

    使用应用模板可以使您更快地满足客户的截止日期,因为所有编程工作都已为您完成。 您需要做的就是根据客户的需求构建应用程序。

    City Guide
    CodeCanyon上可用的许多Android应用程序模板之一

    CodeCanyon上2020年最畅销的Android应用程序模板

    要在2020年进行富有成效的应用程序开发旅程,请抓住这些流行的Android应用程序模板之一。 我们对CodeCanyon提供的数千种Android应用模板进行了梳理,以找出今年20种最佳的Android应用模板。

    2020年最畅销的Android App

    这些Android应用程序模板是在Android Studio中制作,使用Material Design并随附有关如何从头开始配置模板的分步说明或视频教程。 他们通常还支持AdMob,可以选择删除横幅广告和插页式广告。

    2020年20种最佳Android应用程序模板

    在本综述中,我将重点介绍CodeCanyon现在可用的最佳Android应用程序模板,以便您可以在2020年构建理想的Android应用程序。

    最佳通用应用程序模板

    1.

    通用Android应用

    公认的最佳和最受欢迎的Android应用程序模板之一是Universal Android App 。 这款出色的应用程序使用户可以通过从博客,时间轴,提要,订阅源,频道,播放列表或网页等来源中提取无限内容,然后轻松地将它们组合到一个可自定义的应用程序中,来创建几乎所需的任何应用程序。 该模板支持最流行的Web内容源,例如WordPress,YouTube,Facebook和RSS。

    2.

    材料设计界面

    Material Design UI是一个酷炫时尚的Android UI模板,具有五个华丽的主题,可用于使您正在从事的任何应用程序项目更具美学吸引力。 模板主题以社交,旅游,媒体和购物应用为目标,并且有一个通用主题,可与各种应用一起使用。 该模板使用了数百个UI元素,这些元素可以无限地重新组合以创建一个美观且外观独特的应用程序。

    3.

    通用Android WebView应用

    使用Universal Android WebView App将您的移动和响应式网站转换为漂亮的应用程序 。 它与WordPress和其他Web框架兼容,可高度自定义并具有许多功能,并且支持HTML5,CSS3,JavaScript,jQuery,Bootstrap和其他Web技术。

    4. MaterialX

    材质X

    MaterialX是一个UI模板,可以支持您要开发的任何应用程序项目。 它经过专门设计,可通过为您提供精美,易于使用的材料来使您的应用看起来令人惊叹,因此无论您要创建哪个应用,都可以在代码中实现它。 功能包括网格,列表和选项卡视图,媒体播放器,社交媒体时间轴,电子商务购物等。

    最佳社交网络应用模板

    5.

    My Social Network

    我的社交网络”内置于Android Studio中,可让您创建自己的个人社交网络应用,您可以在其中发布帖子,阅读好友的帖子,实时与好友进行个人对话等等。

    6.

    约会应用

    如果您想尝试创建自己的在线约会应用程序,那么约会应用程序模板正是您所需要的。 该模板使用Android Studio构建,其显着功能包括漂亮的图库和用户个人资料。 用户具有评论,回复和发送礼物,查看附近的潜在日期,进行应用内购买,发送带有照片的实时直接消息的能力,并且他们当然可以阻止其他用户。

    7. WoWonder Android Messenger

    WoWonder Android Messenger

    寻找一个Messenger应用程式范本来建立您自己的Android Messenger? 别看WoWonder Android Messenger应用程序模板。 WoWonder Mobile Messenger是WoWonder社交网络设计的Android聊天应用程序,允许用户在手机上一起聊天。 其功能包括能够进行音频和视频通话,发送和接收消息,共享和上传图像,进行录音等等。

    最佳定位器和地图应用模板

    8.

    城市

    城市是复杂的空间,任何能帮助当地人和游客导航的应用程序必定会大受欢迎。 对于想要为其城市创建具有最有趣景点和最佳餐厅,咖啡厅,酒吧,商店等等的应用程序的开发人员而言, The City是一个不错的应用程序模板。

    所有应用程序数据都存储在本地SQLite数据库中,因此该应用程序在脱机模式下工作。 该模板具有出色的功能,例如用于显示位置的MapView,用于推荐地点的功能类别,能够过滤搜索,已保存的搜索历史等等。

    9.

    店铺查找器

    您不能在手机上安装商店查找器应用程序。 这种必不可少的特性使Store Finder应用程序模板在开发人员中很受欢迎。 该应用程序采用Android Studio和材质设计制作而成,具有众多必备功能,例如电子邮件和SMS集成,用户评级和评论,Google指导以及社交媒体登录。 用户还可以在地图上绘制,使用地图图钉,共享到Facebook和Twitter等。

    城市指南

    使用“ 城市指南” Android应用模板为您选择的城市创建自己的便捷旅行指南应用。 该模板在Android Studio中开发并使用Material Design进行了样式设置,易于配置和自定义。 它不需要编程技能即可使用。

    您可以将所选的城市亮点归类为景点,体育,酒店和夜生活等类别。 这些选定的突出显示也可以在交互式地图上视为可单击的点,该地图使用地理位置来识别您手机的当前位置和与每个突出显示的距离。

    最佳音乐和视频应用模板

    11. Android直播电视

    Android直播电视

    Android直播电视应用模板可帮助开发人员创建允许最终用户在其Android设备上观看直播电视的应用。 该应用程序提供一个注册/登录屏幕,一个主屏幕和一个导航屏幕,其中显示了该应用程序的所有部分。 频道是按类别组织的,用户可以评论频道或报告频道问题。 该应用程序易于配置,并提供了详细的文档。

    12.

    您的电台应用

    放下CodeCanyon上最好的广播应用模板, 您的广播应用非常适合想要创建自己的移动互联网广播流应用的开发人员。 借助功能强大的管理面板,该应用程序可以管理无限的广播电台和类别,并支持多种格式。

    13.

    您的视频频道

    如果您是YouTuber,摄像师或具有摄像师客户的开发人员,则您的视频频道应用模板可能会吸引您,因为它实质上允许您创建一个专用于展示您的视频或所选视频集的应用。 该应用程序具有YouTube集成功能,在管理端使用PHP MySQL,并且可以管理无限的类别和视频上传。

    14.

    音乐

    xMusic将吸引正在寻找模板以帮助他们创建在线-离线音乐播放器应用程序的Android开发人员。 该应用程序通过SoundCloud API播放了数百万来自SoundCloud的免费歌曲,但如果愿意,可以从用户自己的音乐库中切换到音乐。

    模板提供的一些出色功能是具有许多预设音乐风格的强大均衡器,对睡眠模式和许多播放列表的支持,强大的搜索等等。

    最佳专用应用模板

    15.

    Android新闻应用

    对于希望为Android设备创建移动新闻应用程序的人来说, Android新闻应用程序模板是首选模板。 用户可以查看不同类别的最新新闻,将文章保存为收藏夹,获得有关最新文章的通知等。 它带有易于使用的管理控制台,用于修改新闻类别和其他详细信息。

    16.

    高清壁纸

    HD Wallpaper应用程序模板允许开发人员创建一个向用户的Android设备提供精美壁纸和背景的应用程序。 该应用程序具有多个画廊的高分辨率图像,轻松的点击,滑动和滚动功能以及离线缓存墙纸。

    17. AdForest

    AdForest

    如果您要构建一个应用来管理广告发布业务的产品列表,则AdForest是理想的分类广告应用模板。 该模板具有内置的文本消息传递系统,可方便买卖双方之间的交流。 它带有推播通知,可在广告上显示消息时提醒用户,并且Google Maps集成允许用户获取到卖家的路线。

    18. 电子商务

    电子商务

    如果您想建立在线电子商务业务,并且需要适合您业务的完美Android移动应用程序,请查看电子商务应用程序模板。 它旨在帮助您快速轻松地创建自己的移动电子商务应用程序。 该模板提供了功能强大的管理面板,因此您可以完全根据需要设置所有内容,包括添加货币和​​税金。 您还可以创建类别和产品菜单,并有效地管理订单。

    19.

    Quizix

    Quizix是一个出色的Android测验应用程序模板,它使用数学,文本和/或照片问题,并具有用于两个到四个答案选项的空间。 开发人员只需在后端添加他们的类别,子类别和问题,然后应用程序即可制定测验。 该模板还随附AdMob标语和插页式广告。

    20.

    食谱食谱应用程序

    使用Cookbook Recipe App模板创建自己的食谱应用程序 。 此本地Android应用程序模板不需要编程技能,并且代码易于配置和自定义。 它还将配方存储在本地SQLite数据库中,因此用户可以在没有Internet连接的情况下运行该应用程序。 其他出色的内置功能包括带有类别,购物清单,收藏夹,功能强大的搜索的抽屉式菜单,Google Analytics(分析),各种动画和效果等。

    使用出色的模板启动您的Android应用

    2020年这20种最佳的Android应用程序模板只是我们在CodeCanyon可用的数百种Android应用程序模板中的一小部分,因此,如果它们都不完全符合您的需求,则还有很多其他不错的选择。

    畅销Android应用2020

    Envato Tuts +上的更多Android App模板资源

    而且,如果您想提高构建Android应用程序和模板的技能,请查看我们提供的一些非常有用的Android教程


    翻译自: https://code.tutsplus.com/articles/15-best-android-app-templates-of-2017--cms-29643

    展开全文
  • 掌握Android Studio环境搭建,虚拟设备配置,程序设计和程序调试方法。
  • 微信小程序开发实战

    万人学习 2016-09-25 16:55:04
    本套课程使用了元认知教学法,直接实战式教学,摆脱学院派的理论式讲解,对于0基础的学员可以入门编写微信小程序,过程中指导如何学习使用文档查阅接口等,通过两个完整的实战小项目的实例,入手小程序开发。
  • C++类模板 template 详细使用方法

    万次阅读 多人点赞 2017-11-27 21:48:30
    C++类模板 template 详细使用方法 类模板与函数模板的定义和使用类似。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: class Compare_int { public : Compare(int a,...
    C++类模板 template <class T>详细使用方法
    类模板与函数模板的定义和使用类似。
    有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:
    class Compare_int
    {
    public :
       Compare(int a,int b)
       {
          x=a;
          y=b;
       }
       int max( )
       {
          return (x>y)?x:y;
       }
       int min( )
       {
          return (x<y)?x:y;
       }
    private :
       int x,y;
    };
    其作用是对两个整数作比较,可以通过调用成员函数max和min得到两个整数中的大者和小者。
    如果想对两个浮点数(float型)作比较,需要另外声明一个类:
    class Compare_float
    {
    public :
       Compare(float a,float b)
       {
          x=a;y=b;
       }
       float max( )
       {
          return (x>y)?x:y;
       }
       float min( )
       {
          return (x<y)?x:y;
       }
    private :
       float x,y;
    }
    显然这基本上是重复性的工作,应该有办法减少重复的工作。
    C++在发展的后期增加了 模板(template ) 的功能,提供了解决这类问题的途径。可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数,如对以上两个类可以综合写出以下的类模板:
    template <class numtype> //声明一个模板,虚拟类型名为numtype
    class Compare //类模板名为Compare
    {
    public :
       Compare(numtype a,numtype b)
       {
          x=a;y=b;
       }
       numtype max( )
       {
          return (x>y)?x:y;
       }
       numtype min( )
       {
          return (x<y)?x:y;
       }
    private :
       numtype x,y;
    };
    请将此类模板和前面第一个Compare_int类作一比较,可以看到有两处不同。

    1) 声明类模板时要增加一行
        template <class 类型参数名>
    template意思是“模板”,是声明类模板时必须写的关键字。在template后面的尖括号内的内容为模板的参数表列,关键字class表示其后面的是类型参数。在本例中numtype就是一个类型参数名。这个名宇是可以任意取的,只要是合法的标识符即可。这里取numtype只是表示“数据类型”的意思而已。此时,mimtype并不是一个已存在的实际类型名,它只是一个虚拟类型参数名。在以后将被一个实际的类型名取代。

    2) 原有的类型名int换成虚拟类型参数名numtype。
    在建立类对象时,如果将实际类型指定为int型,编译系统就会用int取代所有的numtype,如果指定为float型,就用float取代所有的numtype。这样就能实现“一类多用”。

    由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。 利用类模板可以建立含各种数据类型的类。

    那么,在声明了一个类模板后,怎样使用它呢?怎样使它变成一个实际的类?

    先回顾一下用类来定义对象的方法:
        Compare_int cmp1(4,7); // Compare_int是已声明的类
    其作用是建立一个Compare_int类的对象,并将实参4和7分别赋给形参a和b,作为进 行比较的两个整数。

    用类模板定义对象的方法与此相似,但是不能直接写成
       Compare cmp(4,7); // Compare是类模板名
    Compare是类模板名,而不是一个具体的类,类模板体中的类型numtype并不是一个实际的类型,只是一个虚拟的类型,无法用它去定义对象。必须用实际类型名去取代虚拟的类型,具体的做法是:
        Compare <int> cmp(4,7);
    即在类模板名之后在尖括号内指定实际的类型名,在进行编译时,编译系统就用int取代类模板中的类型参数numtype,这样就把类模板具体化了,或者说实例化了。这时Compare<int>就相当于前面介绍的Compare_int类。
    [例] 声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。
    #include <iostream>
    using namespace std;
    template <class numtype>
    //定义类模板
    class Compare
    {
       public :
       Compare(numtype a,numtype b)
       {x=a;y=b;}
       numtype max( )
       {return (x>y)?x:y;}
       numtype min( )
       {return (x<y)?x:y;}
       private :
       numtype x,y;
    };
    int main( )
    {
       Compare<int > cmp1(3,7);  //定义对象cmp1,用于两个整数的比较
       cout<<cmp1.max( )<<" is the Maximum of two integer numbers."<<endl;
       cout<<cmp1.min( )<<" is the Minimum of two integer numbers."<<endl<<endl;
       Compare<float > cmp2(45.78,93.6);  //定义对象cmp2,用于两个浮点数的比较
       cout<<cmp2.max( )<<" is the Maximum of two float numbers."<<endl;
       cout<<cmp2.min( )<<" is the Minimum of two float numbers."<<endl<<endl;
       Compare<char> cmp3(′a′,′A′);  //定义对象cmp3,用于两个字符的比较
       cout<<cmp3.max( )<<" is the Maximum of two characters."<<endl;
       cout<<cmp3.min( )<<" is the Minimum of two characters."<<endl;
       return 0;
    }

    运行结果如下:
    7 is the Maximum of two integers.
    3 is the Minimum of two integers.

    93.6 is the Maximum of two float numbers.
    45.78 is the Minimum of two float numbers.

    a is the Maximum of two characters.
    A is the Minimum of two characters.

    还有一个问题要说明: 上面列出的类模板中的成员函数是在类模板内定义的。如果改为在类模板外定义,不能用一般定义类成员函数的形式:
        numtype Compare::max( ) {…} //不能这样定义类模板中的成员函数
    而应当写成类模板的形式:
        template <class numtype>
        numtype Compare<numtype>::max( )
        {
            return (x>y)?x:y;
        }
    上面第一行表示是类模板,第二行左端的numtype是虚拟类型名,后面的Compare <numtype>是一个整体,是带参的类。表示所定义的max函数是在类Compare <numtype>的作用域内的。在定义对象时,用户当然要指定实际的类型(如int),进行编译时就会将类模板中的虚拟类型名numtype全部用实际的类型代替。这样Compare <numtype >就相当于一个实际的类。大家可以将例9.14改写为在类模板外定义各成员 函数。

    归纳以上的介绍,可以这样声明和使用类模板:
    1) 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。

    2) 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如上例中的numtype)。

    3) 在类声明前面加入一行,格式为:
        template <class 虚拟类型参数>
    如:
        template <class numtype> //注意本行末尾无分号
        class Compare
        {…}; //类体

    4) 用类模板定义对象时用以下形式:
        类模板名<实际类型名> 对象名;
        类模板名<实际类型名> 对象名(实参表列);
    如:
        Compare<int> cmp;
        Compare<int> cmp(3,7);

    5) 如果在类模板外定义成员函数,应写成类模板形式:
       template <class 虚拟类型参数>
       函数类型 类模板名<虚拟类型参数>::成员函数名(函数形参表列) {…}

    关于类模板的几点说明:
    1) 类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如:
        template <class T1,class T2>
        class someclass
        {…};
    在定义对象时分别代入实际的类型名,如:
        someclass<int,double> obj;

    2) 和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象。

    3) 模板可以有层次,一个类模板可以作为基类,派生出派生模板类。有关这方面的知识实际应用较少,本教程暂不作介绍,感兴趣的同学可以自行学习。

    展开全文
  • ionic应用实用模板

    2015-12-17 00:16:45
    基于ionic tabs模板应用修改而来 更符合实际业务需求
  • Android界面控件难点精讲

    万人学习 2016-05-26 10:35:48
    Android控件开发教程,在...则开发效率会高很多,此时,我们则可以使用AdapterView与Adapter高级控件来实现类似MVC的模式进行开发,从而大大提高开发效率本课中会给出AdapterView与Adapter的解决具体问题的应用案例。
  • 微信小程序项目实战之天气预报

    千人学习 2017-07-16 16:43:17
    带领新手完成一个简单的微信小程序天气预报的项目
  • VS2017增加c#控制台应用程序的模板

    千次阅读 2018-09-28 20:48:27
    1. 找到你的 VS 安装程序 2. 打开后 勾选 .NET 桌面开发 3.重启
  • OpenCV3.2 Java图像处理视频学习教程

    千人学习 2017-09-04 18:08:38
    OpenCV3.2 Java图像处理视频...主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。
  • PHP微信接口开发

    万人学习 2015-08-27 17:41:03
    微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发...
  • 微信支付开发——公众号支付

    万人学习 2016-10-27 14:33:09
    微信已经融入人们的生活中,很多企业也在做跟微信相关的开发,但是网络上缺少微信开发相关的教程,特别是视频教程。课程的大特点是,实战 = 理论 + 演示 + 敲代码。这是一部中课程,需要有学习的开发者拥有微信...
  •  array_merge(string2array($v['setting']), array('template_list' => $_POST['setting']['template_list']/*应该加上这个,去替换旧的模板目录名,否则就会变成default(理应是新的,假设是new)/show.html(是新的了)*...
  • 1. 准备好.dotm模板文件,放入模板路径 C:\Users\AppData\Roaming\Microsoft\Templates(每个人电脑的路径可能不一样,大家用关键字搜索一下即可)2. 打开文档,“开发工具-&gt;文档模板”。选中准备好的.dotm...
  • IOS开发从入门精通-第一章

    千人学习 2018-04-08 22:16:23
    本课程详细介绍了IOS开发环境搭建及开发工具的使用,讲解了IOS开发常用视图控件的使用 ,还讲解了一个实用的功能实例:APP启动引导页的开发。
  • OpenCV中的模板匹配方法及其应用

    万次阅读 2014-10-28 16:55:38
    模板匹配(TemplateMatching)就是在一幅图像中寻找和模板图像(template)最相似的区域,该方法原理简单计算速度快,能够应用于目标识别,目标跟踪等多个领域。OpenCV中对应的函数为matchTemplate或cvMatchTemplate...
  • 点进去 转载于:https://www.cnblogs.com/dadidelearning/p/10110427.html
  • Android移植基础

    万人学习 2015-05-21 23:53:34
    Android视频课程,该课程可以让学员了解Android系统架构、学习如何下载Android源码、编译及开发Android、学习如何追踪Android源码、了解Linux内核启动流程、了解Android启动流程、学习如何移植外部函式库至Android...
  • Eclipse 模板使用

    千次阅读 2018-10-02 15:43:33
    java editor template Eclipse中的快速Java代码模板使用 &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相信大家都用过Eclipse的缩写代码提示功能,如...
  • 基于 vue-cli 的 Vue js 单页应用项目模板,在 vue-cli 基础上做了一些合理的修改和增强。功能包括:调试、构建、代码规范校验、单元测试、国际化等。 技术栈 Vue、Webpack、ES6、vue-router、Vuex、SASS、...
  • 精美的ppt模板2

    热门讨论 2013-09-18 11:27:19
    按下“预览”按钮即可进行预览,而单击某个模板名称,就会显示“模板最终许可协议”,在接受协议后单击“在PowerPoint中编辑”,IE就会将模板下载你的硬盘中,并会自动用PowerPoint打开该模板。如果你对模板的效果...
  • 分享200个App移动端模板

    千次阅读 2020-06-07 16:25:53
    APP应用介绍网站模板 APP应用广场CSS网页模板 安卓APP应用展示网站模板 深绿色手机APP开发模板 手机APP粉色网站模板 白色简洁的网站模板 iPhone5S土豪金网页模板 黄色风格手机APP官网模板 绿色APP应.
  • Android开发之fragment回退栈应用

    千人学习 2016-12-01 14:18:38
    本课程将要讲解Android中非常重要的知识点Fragment,Android 3.0中引入fragments 的概念,Fragment使用方式有静态使用和动态使用,开发...本节对Fragment中的回退栈知识做重点讲解,让你对Fragment的理解更上一层楼!
  • React Native作为制作令人惊叹的移动应用程序...为什么要使用React Native UI Kit或模板? 从零开始构建移动应用程序可能是一项艰巨的任务,即使借助React Native等框架也是如此。 可以轻松地有数十个屏幕,导航...
  • Django3.0中settings.py的表单模板配置。 表单模板 配置示例模板模板参数说明TEMPLATES参数说明 示例模板 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path....
  • VS2015创建Windows窗体应用程序(C++)

    万次阅读 2019-07-30 10:11:50
    VS2015没有自带CLR窗体应用程序的模板,在创建窗体应用程序时极为不便。网上通常的做法是创建一个CLR空项目,然后一步一步添加文件,一点一点修改配置,费了许多功夫,对于初学者来说还不一定能成功。。。 相关的...
  • C++函数模板模板函数)详解

    万次阅读 多人点赞 2019-07-04 16:03:01
    C++函数模板模板函数)详解定义用法:函数模板的原理延申用法2.1为什么需要类模板2.2单个类模板语法2.3继承中的类模板语法案例1:案例2:2.4类模板的基础语法2.5类模板语法知识体系梳理1.所有的类模板函数写在类的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 654,407
精华内容 261,762
关键字:

怎么将模板应用到全部