六大设计原则浅析

设计在软件开发中的重要性

重要性

在上大学的时候我们总是不理解为什么要讲这么理论性的东西,当时就一个感觉就是没什么用,我们更想去学习一些可以看到结果的东西,当你毕业之后就会发现基础的知识是多么重要,而这些知识都有一个共性就是可以脱离具体的技术或者问题而存在,是一种可以长期指导我们学习和进步的重要思想,设计原则和模式就是软件开发中的这种思想。

设计原则

我们先来思考一个问题:

怎么样的软件才算一个好的软件或者说对于程序员我们如何评价他(她)的编码技术?

我们来假设一个项目是由某个程序员独立去完成的,他做的事情不仅仅编码这么简单,编写实现功能的代码只占整个项目的30%都不到,他首先做的就应该是对整个项目的技术选择和框架设计(需求的学习和理解暂且不考虑),接下来才是正式编写代码,在实现过程中又需要多次的测试和修改(重构),这样就够了吗?如果能做到这些是可以开发出一个完整的软件,但是还不够。软件工程和盖房子有所区别的地方就在这里,房子盖好就不需要拆了重盖了,软件开发中我们还需要考虑到日后的迭代和变更,所以我们要做到整个结构有一个好的可维护性,设计原则是什么?设计原则就是指导我们实现这种结构的理论基础(也可以说是思想)。

设计模式(3)行为型模式

非常抱歉,尚未完成, 敬请期待……

行为型模式

迭代子模式

责任链模式

命令模式

备忘录模式

状态模式

访问者模式

中介者模式

解释器模式

设计模式(2)结构型模式

结构型模式

桥接模式

将抽象和实现耦合,使得两者可以独立的变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
interface Implementor{

void doSomething();
void doAnything();
}

class ConcreteImplementor1 implements Implementor{

public void doSomething(){
//具体业务处理
}

public void doAnything(){
//具体业务处理
}
}

abstract class Abstraction{

private Implementor imp;

public Abstraction(Implementor _imp){
imp = _imp;
}

//自身的行为和属性
public void request(){
imp.doSomething();
}

public Implementor getImp(){
return imp;
}
}

class RefinedAbstraction extends Abstraction{

public RefinedAbstraction(Implementor _imp){
super(_imp);
}

@Override
public void request(){
super.request();
super.getImp().doAnything();
}
}

class Client{

public static void main(String[] args){
//定义一个实现化角色
Implementor imp = new ConcreteImplementor1();
//定义一个抽象化角色
Abstraction abs = new RefinedAbstraction(imp);
abs.request();
}
}

组合模式

文件系统由文件和目录组成,每个文件里装有内容,而每个目录的内容可以有文件和目录,目录就相当于是由单个对象或组合对象组合而成,如果你想要描述的是这样的数据结构,那么你就可以使用组合模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
abstract class Component {

public abstract void operation();

public void add(Component c) {
throw new UnsupportedOperationException();
}

public void remove(Component c) {
throw new UnsupportedOperationException();
}

public Component getChild(int i) {
throw new UnsupportedOperationException();
}
}

class ConcreteComponent1 extends Component {

public void operation() {
System.out.println("operation of concrete component 1 ");
}
}

class ConcreteComponent2 extends Component {

public void operation() {
System.out.println("operation of concrete component 2 ");
}
}

class ConcreteComponent3 extends Component {

public void operation() {
System.out.println("operation of concrete component 3 ");
}
}

class Composite extends Component {

private ArrayList<Component> children;

public Composite() {
children = new ArrayList<Component>();
}

public void operation() {
for(Component child: children) {
child.operation();
}
}

public void add(Component c) {
children.add(c);
}

public void remove(Component c) {
children.remove(c);
}

public Component getChild(int i) {
return children.get(i);
}
}

public class Client {

public static void main(String[] args) {

Component c1 = new ConcreteComponent1();
Component c2 = new ConcreteComponent2();
Component c3 = new ConcreteComponent3();

Component c = new Composite();
c.add(c1);
c.add(c2);
c.add(c3);
c.operation();

c.remove(c2);
c.operation();
}
}

享元模式

享元,就是共享元素的意思。

https://zhuanlan.zhihu.com/p/53087983

行为型模式

策略模式

模板方法模式

观察者模式

设计模式(1)创建型模式

总体来说设计模式分为三大类:创建型模式、结构型模式、行为型模式。

创建型模式

简单工厂模式

工厂类是整个模式的关键。它包含必要的判断逻辑,能够根据外界给定的信息知道创建那个类的实例,外部无需了解该对象是如何被创建和组织的。有利于软件体系结构化。由于工厂类集中了所有实例的创建逻辑,简单工厂模式的缺点也体现在工厂类上。

1
2
3
4
5
6
7
//Factory类

if( arg == "A" ){
return new FrescoLoader();
}else if( arg == "B" ){
return new GlideLoader();
}

可以明显的看到简单工程模式违反了开放-封闭原则(OCP)

理解Android中的JNI

什么是JNI

JNI是Java Native Interface的缩写(Java本地调用),Java程序中的函数可以调用Native语言写的函数(一般指的是C/C++编写的函数),Native语言写的函数可以调用Java层的函数。

JNI结构示意图

为什么要有JNI

Java语言的跨平台是因为在不同平台上可以运行Java虚拟机,而虚拟机是跑在具体平台上的,而本质上Java是通过JNI技术实现的跨平台,很多基层的模块在Java语言诞生之前已经有了比较优秀的实现,为了避免重复造轮子所以我们要使用JNI技术来使用已有的模块。

Java中的软(弱)引用

Java中的强、软、弱、虚引用

在JDK中我们可以看到有一个java.lang.ref的包,这个包中就是Java中实现强、软、弱、虚引用的包,如下:

Java中的软引、弱、虚引用

Java中的多线程

进程和线程

操作系统有两个容易混淆的概念,进程和线程

进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。
线程:表示程序的执行流程,是CPU调度执行的基本单位;线程有自己的程序计数器、寄存器、堆栈和帧。同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源。

进程是操作系统资源分配的最小单位(CPU时间, 内存空间),线程就是共享虚拟内存映射的进程,多个线程属于一个进程。

Java标准库提供了进程和线程相关的API,进程主要包括表示进程的java.lang.Process类和创建进程的java.lang.ProcessBuilder类

表示线程的是java.lang.Thread类,在虚拟机启动之后,通常只有Java类的main方法这个普通线程运行,运行时可以创建和启动新的线程;还有一类守护线程(damon thread),守护线程在后台运行,提供程序运行时所需的服务。当虚拟机中运行的所有线程都是守护线程时,虚拟机终止运行。

My BookMark

the content has been encrypted, enter the password to read.
Ajax Android AndroidStudio Animation Anroid Studio AppBarLayout Babel Banner Buffer Bulma ByteBuffer C++ C11 C89 C99 CDN CMYK COM1 COM2 CSS Camera Raw, 直方图 Chrome ContentProvider CoordinatorLayout C语言 DML DOM Dagger Dagger2 Darktable Demo Document DownloadManage ES2015 ESLint Element Error Exception Extensions File FileProvider Flow Fresco GCC Git GitHub GitLab Gradle Groovy HTML5 Handler HandlerThread Hexo Hybrid I/O IDEA IO ImageMagick IntelliJ Intellij Interpolator JCenter JNI JS Java JavaScript JsBridge Kotlin Lab Lambda Lifecycle Lint Linux Looper MQTT MVC MVP Maven MessageQueue Modbus Momentum MySQL NDK NIO NexT Next Nodejs ObjectAnimator Oracle VM Permission PhotoShop Physics Python RGB RS-232 RTU Remote-SSH Retrofit Runnable RxAndroid RxJava SE0 SSH Spring SpringBoot Statubar Task Theme Thread Tkinter UI UIKit UML VM virtualBox VS Code VUE ValueAnimator ViewPropertyAnimator Vue Web Web前端 Workbench api apk bookmark by关键字 compileOnly css c语言 databases demo hexo hotfix html iOS icarus implementation init jQuery javascript launchModel logo merge mvp offset photos pug query rxjava2 scss servlet shell svg tkinter tomcat transition unicode utf-8 vector virtual box vscode 七牛 下载 中介者模式 串口 临潼石榴 主题 书签 事件 享元模式 仓库 代理模式 位运算 依赖注入 修改,tables 光和色 内存 内核 内部分享 函数 函数式编程 分支 分析 创建 删除 动画 单例模式 压缩图片 发布 可空性 合并 同向性 后期 启动模式 命令 命令模式 响应式 响应式编程 图层 图床 图片压缩 图片处理 图片轮播 地球 域名 基础 增加 备忘录模式 外观模式 多线程 大爆炸 天气APP 太白山 头文件 奇点 字符串 字符集 存储引擎 宇宙 宏定义 实践 属性 属性动画 岐山擀面皮 岐山肉臊子 岐山香醋 工具 工厂模式 年终总结 开发技巧 异常 弱引用 恒星 打包 技巧 指针 插件 摄影 操作系统 攻略 故事 数据库 数据类型 数组 文件 新功能 旅行 旋转木马 时序图 时空 时间简史 曲线 杂谈 权限 枚举 架构 查询 标准库 标签选择器 样式 核心 框架 案例 桥接模式 检测工具 模块化 模板引擎 模板方法模式 油泼辣子 泛型 洛川苹果 浅色状态栏 源码 源码分析 瀑布流 热修复 版本 版本控制 状态栏 状态模式 生活 留言板 相册 相对论 眉县猕猴桃 知识点 码云 磁盘 科学 笔记 策略模式 类图 系统,发行版, GNU 索引 组件 组合模式 结构 结构体 编码 网易云信 网格布局 网站广播 网站通知 网络 美化 联合 膨胀的宇宙 自定义 自定义View 自定义插件 蒙版 虚拟 虚拟机 补码 补齐 表单 表达式 装饰模式 西安 观察者模式 规范 视图 视频 解耦器模式 设计 设计原则 设计模式 访问者模式 语法 责任链模式 贪吃蛇 转换 软件工程 软引用 运算符 迭代子模式 适配器模式 选择器 通信 通道 配置 链表 锐化 错误 键盘 闭包 降噪 陕西地方特产 面向对象 项目优化 项目构建 黑洞
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×