【软件体系结构】软件体系结构风格

软件体系结构风格

软件体系结构的学习第二篇,软件体系结构风格。

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.

版权声明:本文为Lord_Bao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。