10/24 设计模式之桥接模式 Bridge Pattern

类别:结构型设计模式

目的:将抽象和实现按维度拆分成两部分(通常两类接口),使得两部分都可以独立的进行迭代(变化),防止类数量爆发式增长

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri33d5NhvwuPkHa8F?e=LLClnq

典型场景

被抽象数量比较多时,新增特性导致抽象数量可能会骤增(比如一个特性就增加2-3个类)就可以考虑使用桥接模式了

比如抽象万能电视机遥控场景、存在多个遥控场景(每个场景功能不一样),以及要适配多种电视类型
再比如造车,存在多种类型的车(卡车、公交车、小轿车等),每种类型的车的生产过程不尽相同

这里拿万能遥控器场景举例,场景参考如下:

  1. 基本遥控场景:开机、关机
  2. 看电视台场景:选择电视台、同时也可以开关机
  3. 看电影场景:播放、暂停、开关机等

可以看到这个场景是有层级结构的,比如电视台场景就涵盖了基本的开关机场景

目前举例适配的电视类型参考如下:

  1. 索尼电视
  2. 三星电视

可以看到这个电视类型的适配可能会更多

Read more   2020/3/24 posted in  设计模式 JAVA

9/24 设计模式之迭代器者模式 Iterator Pattern

类别:行为型设计模式

目的:在改变对象内部数据结构时,不改变外部对该对象的迭代行为,从而减少因数据结构改变带来的外部代码改变

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3wVBHQNkHkAz7ci?e=bO7hoD

典型场景

比如保存历史内容的编辑器Editor, 业务场景中需要取出所有的历史记录进行循环处理,一般是在Editor中提供一个方法返回所有的历史内容

Editor.java参考如下:

public class Editor {
    private List<String> contentHistory = new ArrayList<>();

    public void push(String content) {
        contentHistory.add(content);
    }

    public String pop() {
        return contentHistory.remove(contentHistory.size() - 1);
    }
    
    public List<String> getContentHistory() {
        return contentHistory;
    }
}

对应的循环历史记录的代码参考如下:

Read more   2020/3/24 posted in  设计模式 JAVA

佛系Xcode开发(一)从"0"构建一个mac菜单栏应用

苹果作为世界市值最高的公司,即使它的商店对卖出的app提取30%的销售额,为其开发软件仍然是有价值的,研究学习mac和ios软件开发环境xcode就很有必要了

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3sBDF9hUZc71YmZ?e=TI6OeP

创建项目

在File菜单中选择New -> Project创建项目

选择macOS应用分类下的App即可,操作效果如下

然后xcode要求输入应用基础设计,一切从简参考如下:

Read more   2020/3/21 posted in  mac&ios

8/24 设计模式之观察者模式 Observer Pattern

类别:行为型设计模式

目的:在对象自身状态发生变化时,立刻通知需要知道这个新状态的对象(们)

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3dNicP8EQjwPUw_?e=klJYWD

典型场景

表格中的数字由5改为500后,这张表格对应的柱状图和链接的数字(黄色部分)同时立即发生对等改变(Excel的特性)
table_observe

下面使用表格、图表、链接数字指代上面图片的左、中、右部分

基本事实:

  1. 表格数据发生变化时,需要立刻通知图表和链接的数字进行对应的变更
Read more   2020/3/18 posted in  设计模式 JAVA

互联网程序员能力模型设计

互联网是高科技/崇尚技术的公司,意味着所有问题都可以通过/间接通过技术来解决,遇到问题后,优先选择技术方式进行处理

人是不可靠的,尽可能使用规则和制度进行限定,保证稳定的产出质量

理解需求的能力

通常产品经理会把需求落实为文字+图片的形式即PRD(Product Requirement Document)放在wiki上让程序员先预习

预习的质量直接决定着理解需求的能力,从技术角度有以下方式提高预习的质量

  1. 站在产品角度思考问题,思考产品在写下这个wiki时的状态,估算出wiki中缺少的信息,并自行进行查找相关资料进行验证

  2. 熟悉wiki系统的使用,比如confluence这个wiki系统的收藏功能

点击头像下拉菜单中的收藏即可进入收藏列表

Read more   2020/3/17 posted in  项目管理 业务

7/24 设计模式之中介者模式 Mediator Pattern

类别:行为型设计模式

目的:将数个相互耦合的对象进行解耦,转为只耦合一个中介者对象

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3aYThIUHA4m6crp?e=6d4aE3

典型场景

在ui界面中,点击一个按钮,这个按钮的状态会影响其它按钮的状态,并改变表格的显示方式,参考如下:

2020-03-16_16-38-13 -1-

场景效果:

  1. 点击居左按钮后,表格左对齐,并且居左按钮高亮,居中、居右按钮取消高亮
  2. 点击居中按钮后,表格居中对齐,并且居中按钮高亮,居左、居右按钮取消高亮
  3. 点击居右按钮后,表格居右对齐,并且居右按钮高亮,居左、居中按钮取消高亮
Read more   2020/3/16 posted in  设计模式 JAVA

6/24 设计模式之享元模式 Flyweight Pattern

类别:结构型设计模式

目的:减少潜在的对象创建次数、尽可能延迟创建/重用对象,降低内存占用,并对代码实现结构进行限定

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3URckgGBGw8WoWh?e=I6BRDg

典型场景

有许多不同种类的对象需要被使用,需要延迟对象的创建、同类对象会创建多次

比如一张地图中包含很多点,每个点会有一个图标表示这个地点的类型,比如餐厅、体育馆、办公楼、图书馆等。把这些点显示在地图上,程序需要先在内存中保存这些点

基本事实:

  1. 一张地图上可能会有成千上万的点需要绘制
  2. 每个地图点在地图上一般会以图片进行显示
  3. 一个图片文件内容占用的内容空间远超普通对象
  4. 为了避免地图加载过程中占用过多内存,有必要优化地图点上的内存空间占用
Read more   2020/3/11 posted in  设计模式 JAVA

5/24 设计模式之组合模式 Composite Pattern

类别:结构型设计模式

目的:表示一组对象,这组对象的用法和单个对象的用法一致

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3TfmAb69-DF82jQ?e=DR2vwn

典型场景

处理电脑上的文件和文件夹

基本事实

  1. 文件和文件夹可以有多个
  2. 文件和文件夹有多个共同的操作,比如:删除、移动、复制等

这里拿对多个文件夹和文件执行删除操作举例,对应mac下右键Move to Trash按钮

可以看到,可以选中多个文件和文件夹执行删除、复制、移动、获取属性信息等操作

Read more   2020/3/9 posted in  设计模式 JAVA

4/24 设计模式之命令设计模式 Command Pattern

类别:行为型设计模式

目的:解耦行为的接收方和行为的实际处理逻辑

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3MMlUz2cbydE0Eu?e=X6DGEG

典型场景

gui窗口界面上的一个按钮对象,点击后执行一断逻辑处理代码

硬编码

构造一个按钮类,并在点击(click)时执行业务逻辑代码,参考代码如下:

public class Button {
    private String label;

    public void click() {
        // doBusinessLogic(); 逻辑处理代码
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}

核心问题

按钮和按钮点后的业务逻辑代码耦合在一起

  1. button的复用变得困难
  2. 逻辑代码的复用变得困难
Read more   2020/3/6 posted in  设计模式 JAVA

3/24 设计模式之责任链设计模式 Chain Of Responsibility Pattern

类别:行为型设计模式

目的:将为了达成共同目标的一系列具有逻辑顺序的操作进行解耦

完整代码参考:https://1drv.ms/u/s!AquRvPzqx59Ri3IZYwf83oLFp6Pu?e=i6yxH7

典型场景

为一个web请求定义的一些列操作,比如

  1. 用户登陆验证
  2. 处理业务逻辑
  3. 压缩响应数据

注意以上3个操作是顺序的,需要登陆成功后再执行业务逻辑,业务逻辑生成响应数据后,才需要压缩响应数据

构造一个简单的http请求对象备用,参考:

public class HttpRequest {
    private String username;
    private String password;

    public HttpRequest(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}
Read more   2020/3/1 posted in  设计模式 JAVA

2/24 设计模式之访问者设计模式 Visitor Pattern

类别:行为型设计模式

目的:不改变类的定义的约束下,为类的对象应用/添加新的行为

典型场景

现存一系列对象,比如由很多html标签对象组成了一个html页面,这里拿几个html标签举例

标签 当前状态 目标状态
a <a href=“#”>link</a> 添加class=“underlinea"
p <p>this is a paragraph</p> 添加style=“font: bold"
h1 <h1>new title</h1> 添加id=“h1-highlight"

当前代码状态如下,注意需要修改的部分

Read more   2020/2/27 posted in  设计模式 JAVA

论坛系统架构设计和商业模型分析

参与了论坛系统的开发,总结一下

技术栈

  1. 使用git进行代码版本控制
  2. 使用jumpserver管理服务器资产权限
  3. 使用kafka做消息队列系统
  4. 使用elasticsearch存放大批量关联数据
  5. 使用内部研发的代码部署审核系统
  6. 使用yii1框架(历史遗留系统了)
  7. 使用qconf做分布式配置中心
  8. 使用logrotate做日志轮转
  9. 使用sphinx做文本分词和搜索
  10. 使用confluence做文档管理
  11. 使用禅道做项目bug管理

内容主表设计

内容系统内容表主体主要是存放内容公有的字段,比如帖子标题、帖子类型、浏览数等

一些特殊的字段,比如帖子内容字段因为占用空间比较大(通常是text数据类型),并不适合放在内容主体表中(影响查询速度),可以单独创建一张表来进行存储

CREATE TABLE `tb_subject` (
  `subject_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL DEFAULT '',
  `subject_type` text NOT NULL DEFAULT 0,
  `uid` bigint(20) unsigned NOT NULL DEFAULT 0,
  `view_cnt` int(11) NOT NULL DEFAULT 0,
  `display_yn` tinyint(1) NOT NULL DEFAULT 1,
  `create_date` datetime NOT NULL DEFAULT current_timestamp() COMMENT '创建时间',
  `update_date` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '更新时间',
  PRIMARY KEY (`subject_id`),
  KEY `idx_uid` (`uid`,`create_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='贴子主体表';
Read more   2020/2/27