设计模式的七大原则

设计模式(面向对象)有七大原则,分别是:
  1.开放-封闭原则
  2.单一职责原则
  3.依赖倒转原则
  4.迪米特法则(也称为最小知识原则)
  5.接口隔离原则
  6.合成/聚合复用原则
  7.里氏代换原则
开放-封闭原则具有理想主义的色彩,他是面向对象设计的终极目标。其他几条则可以看做是开放-封闭原则的实现方法。设计模式就是实现了这些原则,从而达到了代码复用,增加可维护性的目的。
一.开放-封闭原则
  概念:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。模块应该尽量在不修改原代码的情况下进行扩展。
  在软件周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给代码引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。当软件需求变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有代码来实现变化。
  开放封闭原则是面向对象设计的核心所在,遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现的频繁变化的那些部分作出抽象,然而,对于应用程序中的每个部分都刻意的进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
  注意事项:
  1.通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法。
  2.参数类型、引用对象尽量使用接口或者抽象类,而不是实现类
  3.抽象层尽量保持稳定,一旦确定不允许修改。
二.单一职责原则
  概念:就一个类而言,应该仅有一个引起它变化的原因。
  当我们在做编程的时候,很自然的回个一个类加上各种各样的功能。这样意味着,无论任何需求要来,你都需要更改这个类,这样其实是很糟糕的,维护麻烦,复用不可能,也缺乏灵活性。如果一个类承担的职责过多,就等于把这些职责耦合起来,一个职责变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到很多意想不到的破坏。
三.依赖倒转原则
  概念:依赖倒转原则是程序要依赖于抽象接口,不要依赖于具体实现。简单的来说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块的耦合。
  有时候为了代码复用,一般会把常用的代码写成函数或类库。这样开发新项目的时候直接用就行了。比如做项目的时候大多要访问数据库,所以我们把访问数据库的代码写成了函数。每次做项目去调用这些函数。那么问题来了,我们要做新项目的时候,发现业务逻辑高层模块都是一样的,但客户却希望使用不同的数据库或存储方式,这时就出现了麻烦。我们希望能再次利用这些高层模块,但是高层模块都是与低层的访问数据库绑定在一起,没办法复用这些高层的模块。所以不管是高层模块和底层模块都应该依赖于抽象,具体一点就是接口或者抽象类,只要接口是稳定的,那么任何一个更改都不用担心。
  注意事项:
  1.高层模块不应该依赖于低层模块。两个都应该依赖抽象。
  2.抽象不应该依赖结节。细节应依赖于抽象。
四.迪米特法则(也称为最小知识原则)
  概念:一个软件实体应当尽可能的少与其他实体发生相互作用。每一个软件单位对其他软件单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。迪米特法则不希望类之间建立直接的联系。如果有真的需要建立联系的,也希望能通过他的友元类来转达。因此,应用迪米特法则有可能造成一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互关系,这在一定程度上增加了系统的复杂度。
五.接口隔离原则
  概念:客户端不应该依赖他不需要的接口,类间的依赖关系应建立在最小的接口上。
  接口隔离原则的核心定义,不出现臃肿的接口,但是“小”是有限度的,首先就是不能违反单一职责原则。
六.合成/聚合复用原则
  概念:合成/聚合复用原则经常又叫做合成复用原则,就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过这些对象的委派达到复用已有功能的目的。他的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。
七.里氏代换原则
  概念:里氏代换原则是面向对象设计的基本原则之一。即任何基类可以出现的地方,子类一定可以出现。里氏代换原则是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受影响时,基类才能被真正复用,而衍生类也能够在积累的基础上增加新的行为,里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。在基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
  当满足继承的时候,父类肯定存在非私有的成员,子类肯定是得到了父类的这些非私有成员(假设,父类的成员全部是私有的,那么子类没办法从父类继承任何成员,也就不存在继承的额概念了)。既然子类继承了父类的这些非私有成员,那么父类对象也就可以在子类对象中调用这些非私有成员。所以,子类对象可以替换父类对象的位置。
  在里氏带环原则下,当需求有变化时,只需继承,而别的东西不会改变。由于里氏代换原则才使得开放封闭称为可能。这样使得子类在父类无需修改就可以扩展。  

长链接转短链接

应用场景:之前手机上收到的垃圾短信都是一大串的连接;现在收到的基本上都是很短的连接
* 大部分长连接转短连接都是采用新浪微博平台的开放接口;下方实际也是采用微博提供的接口
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>生成短链接</title>
</head>
<!-- <script src="jquery-2.1.1.min.js"></script> -->
<body>
    <input type="text" name="" id="url">
    <button id="get_short">生成</button>
    <a id="myDiv">点我</a>
</body>
<script type="text/javascript">
 
    // 绑定按钮事件
    btn_getshort = document.getElementById('get_short');
    btn_getshort.onclick = function (){
        var source = '3271760578';
        var url = document.getElementById('url').value;
        var all = 'http://api.t.sina.com.cn/short_url/shorten.json?source=' + source
        +'&url_long='+ url;
        document.getElementById("myDiv").href = all;
    }
</script>
</html>

微博长链转短链的文档

企业应用快速开发平台

JeeSite

JeeSite 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache 
Shiro、MyBatis、Beetl、Bootstrap、AdminLTE),在线代码生成功能,包括核心模块如:组织机构、角色
用户、菜单及按钮授权、数据权限、系统参数、内容管理、工作流等。采用松耦合设计;界面无刷新,一键换肤;
众多账号安全设置,密码策略;在线定时任务配置;支持集群,支持SAAS;支持多数据源。

JeeSite 快速开发平台的主要目的是能够让初级的研发人员快速的开发出复杂的业务功能,让开发者注重专注业务,
其余有平台来封装技术细节,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。

JeeSite 自开源以来已被广大爱好者用到了企业、政府、医疗、金融、互联网等各个领域中,JeeSite 依架构简单精良、
易于扩展、大众思维的设计模式,深入开发者的内心,并得到一致好评,于2016和2017连续两年获得开源中国《最受欢迎中
国开源软件》奖杯,期间也帮助了不少刚毕业的大学生作为入门教材,快速的去实践。

现在 JeeSite 4.0 来了,4.0的升级,作者结合了多年总结和经验,以及各方面的应用案例,对架构完成了一次全部重构,
也纳入很多新的思想。不管是从开发者模式、底层架构、逻辑处理还是到用户界面,用户交互体验上都有很大的进步,在不
忘学习成本、提高开发效率的情况下,安全方面也做和很多工作,包括:身份认证、密码策略、安全审计、日志收集。
JeeSite官网地址

另外jee系列的企业快速开发平台还有:
JeePlus
Jeecg

可通过搜索查看其部署的演示系统
例如jeecg的演示系统http://demo.jeecg.org

使用git命令上传项目到远程仓库

右键打开git Bash Here

1.cd到项目所在目录,例如
cd C:\workspace\zjwk\finger-search

2.在当前目录下初始化git仓库
git init

3.关联远程仓库
git remote add origin <你的项目地址> 
//注:项目地址形式为:http://git.oschina.net/xxx/xxx.git或者

4.提交到暂存区
git add .

5.提交到本地仓库
git commit -m "first"

6.推送到远程仓库
git push origin master

7.如果你再远程仓库设置项目为私有化
那么此处则需要输入账号密码
(我再输入账号密码的时候始终无法通过验证)
于是就转用ssh提交

8.检查连接
$ git remote -v
可看到
origin  https://gitee.com/nyjcq/yilianjiaoyu.git (fetch)
origin  https://gitee.com/nyjcq/yilianjiaoyu.git (push)
我们可以看出当前是https连接

9.移除当前连接
git remote remove origin

10.建立新的连接
git remote add origin  git@gitee.com:nyjcq/yilianjiaoyu.git;
此时检查连接可发现https已经变成git方式

11.此时推送到远程仓库
$ git push -u origin master
如推送成功则结束
如不成功则需对密钥进行重新设置

12.删除当前key,然后重新生成key
$ ssh-keygen -t rsa -C "964936066@qq.com"

会在本地C:\Users\你的用户名.ssh生成文件夹,
里面有id_rsa和id_rsa.pub两个文件 
然后复制id_rsa.pub文件里面的内容,
到码云SSH公钥设置重新创建一个即可

13.通过查看可发现原来的远程连接已经没有了,需重新建立连接
git remote add origin  git@gitee.com:nyjcq/yilianjiaoyu.git;

14.执行提交上传
$ git push -u origin master
以上部分为首次上传情况
以下将主要针对二次上传出现的情况
1.提交到暂存区
git add .

2.提交到本地仓库
git commit -m "first"

3.推送到远程仓库
git push origin master
如遇冲突,可执行

强制推送(舍弃线上)
git push origin master -f

下拉覆盖(保留线上)
git pull origin master
此时如果无法进行自动合并,则需手动合并
如下图
http://git.oschina.net/uploads/images/2016/0226/114058_429e8b54_62561.gif

码云官方文档-如何解决冲突

Maven执行install出现ERROR

1.确定idea或eclipse等开发环境中设置的本地方库是否为你认为的位置
因此可能出现的错误:idea设置仓库地址为B,执行发生错误,你却一直在A仓库操作

2.执行install,查看错误日志
如果为多个串联项目,则先判断是自己项目的问题还是远程项目的问题
如果是自己项目的问题,则到此项目执行install
如果错误查看日志,这是应该是远程项目的问题

3.解决远程项目问题
查看本地仓库中时候成功下载jar包

3.1没有成功下载则尝试重新下载看时候为网络问题

3.1.1如非网络问题
新建项目加入pom依赖,查看是否下载成功
如下载成功则是自身项目问题,需进一步查看
3.1.2否则则是jar包问题,这是需手动下载jar包并放置到本地方库

3.2如成功下载jar包
则可能是因为jar包冲突引起,导致项目无法确定调用的某个类该选择谁

JDK版本降低无效

依照原本安装为jdk1.8降级为jdk1.7无效为例

前提:
1.之前安装jdk版本为1.8
2.重新安装jdk1.7并将JAVA_HOME切换为1.7路径
3.点击确定后打开cmd执行java -version显示还是1.8

解决方案:
1.删除C:\Windows\System32目录下的java.exe、javaw.exe、javaws.exe三个文件
如果没有找到这些文件就跳过
2.删除环境变量Path中C:\ProgramData\Oracle\Java\javapath的配置
把path的值贴出来看一下应该会有这一段的,直接删掉重新查看版本显示1.7

APICloud

偶然发现APICloud这个平台

编码部分主要是通过H5实现

可一键生成android端和ios端安装包

提供控制台可清晰查看APP用户等数据

提供云技术接口等可提高开发效率

拥有开源实例项目,直接部署可用,例如仿今日头条等

喜欢移动端开发的可以深入研究下,官方文档齐全