软件体系结构风格
文章目录
软件体系结构的学习第二篇,软件体系结构风格。
1.软件体系结构定义
软件体系结构的定义:某一特定软件领域的系统组织方式的惯用方式。通俗来讲就是某一类软件的体系结构的特性抽象,它还是由3C构成(Component,Connector,Constraint)。软件体系结构与不同的软件体系结构风格的关系就好比人与黄种人,白种人,黄种人的关系。
2.常见软件体系结构风格
下文的每个软件体系结构风格会从Component,Connector来讲述,一些会附有例子辅助理解。
2.1管道和过滤器
构件:过滤器,输入一组数据,经过处理,并输出一组数据。(IPO)
连接件:管道,将一个构件的输出作为另一个构件的输入。
e.g Linux的管道命令,编译器,Java8特性Stream
2.2数据抽象和面向对象组织
构件:对象
连接件:函数或过程(通过它们实现对象的交互)
2.3基于事件的隐式调用
构件分为两种,事件源( Event Source)和事件处理器(Event Handler)。
连接件为注册。
这个软件体系结构风格与观察者模式相关,事件源就是观察目标,事件处理器就是观察者。将观察者注册到观察目标中的注册对应的就是连接件。所谓隐式调用指的就是事件源和事件处理器是独立的两个构件,事件源并不知道当它触发时,事件处理器会作何反应。
e.g 数据库管理系统和用户界面。
场景模拟:
点击按钮,画面随机变色,按钮的内容变为颜色对应的rgb参数。
测试代码:
package com.lordbao.practice;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
/**
* @Author Lord_Bao
* @Date 2020/10/12 18:38
* @Version 1.0
*/
public class TestImplicitCallBasedOnEvent {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends JFrame{
//面板容器,用于添加组件
private JPanel panel;
public MyFrame(){
//面板容器,用于添加组件
panel = new JPanel();
JButton button = new JButton("Button");
panel.add(button);
//设置框体起始位置和大小
this.setBounds(200,200,400,400);
//设置点击关闭按钮,默认程序终止
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(panel);
this.setVisible(true);
/** 核心代码
* 注册 :将观察者注册到观察目标里去
*
* 注册即为连接件
* 观察者即ChangePaneColorListener 就是事件处理构件
* 观察目标即 Button 就是事件源控件
*
* 所谓隐式就是事件源构件并不知道当它触发时,事件处理构件会作何处理。
* 只有当事件触发时,才会知道事件处理构件如何处理。
*/
button.addActionListener(new ChangePaneColorListener());
}
//内部类
private class ChangePaneColorListener implements ActionListener{
/**
* 事件处理构件的处理
*/
@Override
public void actionPerformed(ActionEvent e) {
/**
* 给面板的背景产生一个随机的颜色
*/
Random random = new Random() ;
int r = random.nextInt(256);
int g= random.nextInt(256);
int b = random.nextInt(256);
Color backgroundColor = new Color(r,g,b);
panel.setBackground(backgroundColor);
/**
* 如果事件源(Event Source)是按钮
* 那么该按钮的文本就设置为Color的种类
*/
if(e.getSource().getClass().equals(JButton.class)){
JButton button = (JButton)e.getSource();
button.setText(backgroundColor.toString());
}
}
}
}
测试效果:

核心代码及分析:
/** 核心代码
* 注册 :将观察者注册到观察目标里去
*
* 注册即为连接件
* 观察者即ChangePaneColorListener 就是事件处理构件
* 观察目标即 Button 就是事件源控件
*
* 所谓隐式就是事件源构件并不知道当它触发时,事件处理构件会作何处理。
* 只有当事件触发时,才会知道事件处理构件如何处理。
*/
button.addActionListener(new ChangePaneColorListener());
2.4分层系统
构件:各个层
连接件:层之间的调用
这样的分层系统的好处就是降低耦合,提高复用。
e.g MVC架构,OSI7层模型。
2.5仓库系统
构件:中央结构(数据库)和其他一些独立构件的集合
连接件:仓库和在系统中很重要的外部构件之间的相互作用
2.6C/S风格
C/S风格的是基于资源不对等,且为了资源共享而提出的,核心组成部分为Client(客户端),Server(服务端)和网络。显然,客户端和服务端为构件,网络即为连接件。
C/S风格整体来说可分为三类,如下图所示。

如图,不难发现,数据层是放在服务器上的,而表示层是放在客户机上的。功能层放在服务器还是客户机的一个效果就是减轻了另一方的压力。其中(2)是三层C/S风格的体现,它将数据层,功能层分别用不同的服务器来处理,目的也很明显,减轻压力,可以实现并行开发,但是这样构建成本也会有增高。
C/S架构的优点就是数据操作和事务处理很强,灵活性也比较高(服务器和客户机根据实际情况进行功能调整)
C/S架构的缺点就是跨平台能力差,需要针对不同操作系统进行开发,这样成本会提高,除此外更新繁琐不方便。
比如QQ领不到新版的红包,游戏需要更新补丁。
2.7B/S风格
B/S即Browser和Server,它其实也是三层C/S风格的体现方式。如下图所示:
基于B/S体系结构的软件,系统安装、修改和维护全在服务器端解决,从而达到了一种“零客户端”的功能。
B/S很明显的优点就是跨操作系统,升级更加方便(刷新一下即可)。
B/S的缺点就是安全性以及响应速度都会低于C/S风格。
针对实际情况,采用不同的C/S或是B/S架构或是混合结构进行开发。
e.g1后台管理用C/S,前端展示用B/S。
e.g2公司内网用B/S,远程访问用C/S。
e.g3银行,监控,医疗用C/S.
3.总结
1.软件体系结构风格是某一类特定领域的软件体系结构的抽象总结,本质还是由3C构成,灵明石猴和六耳猕猴都是猴。
2.软件体系结构风格有个印象即可,当然基于事件的隐式调用和C/S和B/S着重理解。
- 基于事件的隐式调用:所谓隐式指的是事件源并不知道当它触发时,事件处理器会作何反应。这里和观察者模式挂钩。
- C/S分为三类:2层的优点是易于理解,3层的优点是便于并行开发,但会增加成本,通信效率会降低。整个C/S的优点是安全和灵活,缺点是跨平台导致成本高,升级维护麻烦。
- B/S是C/S的一个特例,它是三层C/S的一个体现,它将软件的升级,维护,数据处理全部都放在服务端。它的优点是升级方便,跨操作系统。缺点就是安全和响应速度会低于C/S.