首页 > 代码库 > 层次风格
层次风格
层次风格
了解很多其它软件体系结构风格
层次系统
–在层次系统中,系统被组织成若干个层次。每一个层次由一系列组件组成
–下层组件向上层组件提供服务
–上层组件被看作是下层组件的客户
§系统中的每一层都要承担两个角色。
–首先,它要为结构中的上层提供服务;
–其次。它要作为结构中以下层次的客户,调用下层提供的功能函数。
–最高层和最低层例外。
基本组件:各层次内部包括的组件
§连接件:层间的交互协议
§拓扑结构:分层
§拓扑约束:对相邻层间交互的约束
–集中式部署(Mainframe)
–分布式部署(Distributed)
长处:
–支持基于抽象程度递增的系统设计,有利于设计者对一个复杂
系统进行分解。
–局部依赖性,由于每一层至多和相邻的上下层交互。因此功能
的改变通常影响相邻的上下层;
–可复用性,假设某独立层保证了功能的完整性而且提供了文档
化的接口。便可在多个语境中复用。
–可替换性,仅仅要提供的服务接口定义不变,同一层的不同实现
能够交换使用。这样,就能够定义一组标准的接口,而同意各
种不同的实现方法。
–对标准化的支持。清晰定义而且广泛接受的抽象层次可以促进
实现标准化的任务和接口开发,相同接口的不同实现可以互换
使用。
–可測试性。具有定义明白的层接口以及交换层接口的各个实现
的能力提高了可測试性。
缺点:
并非每一个系统都能够非常easy地划分为分层的模式。甚至即使一个系统的逻辑结构是层次化的。出于对系统性能的考虑。系统设计师不得不把一些低级或高级的功能综合起来;
§效率的减少:
–由分层风格构成的系统,执行效率往往低于总体结构。
–在上层中的服务假设有非常多依赖于最底层,则相关的数据必须通过一些中间层的若干次转化,才干传到;
§非常难找到合适的、正确的层次抽象方法:
–层数太少,分层不能全然发挥这样的风格的可复用性、可更改性和可移植性上的潜力。
–层数过多。则引入不必要的复杂性和层间隔离冗余以及层间传输开销。
–眼下,没有可行的广为人们所认可的层粒度的确定和层任务的分配方法。
程序:
第一层为用户图形界面层
importjava.awt.*;
importjava.util.*;
importjavax.swing.*;
importjava.awt.event.*;
importcom.sun.java.swing.plaf.windows.*;
public class TestingGUI extendsJPanel{
private JTextArea txtTestInfo, txtTestcase;
private JLabel lblTestcases;
private JPanel buttonPanel;
private JComboBox cmbTestcases;
private static final String CASE_BUBBLE= "TC1-Test BubbleSort";
private static final String CASE_HEAP= "TC2-Test Heap Sort";
private static final String CASE_INSERTION= "TC3-Test InsertionSort";
private static final String EXECUTE = "Execute";
private static final String EXIT = "Exit";
public TestingGUI(){
txtTestInfo=new JTextArea("Test outputfrom source shown here\n", 6, 20);
txtTestInfo.setLineWrap(true);
txtTestcase = new JTextArea("Testcaseinfo and test validation shown here\n", 4, 15);
txtTestcase.setLineWrap(true);
buildUpScrollGUI();
}
private void buildUpScrollGUI(){
setUpButtonPanel();
JScrollPane btnPane = new JScrollPane(buttonPanel);
JScrollPane textPane = newJScrollPane(txtTestcase);
textPane.setMinimumSize(new Dimension(250,150));
JScrollPane testDataPane = newJScrollPane(txtTestInfo);
JSplitPane upSplitPane = newJSplitPane(JSplitPane.HORIZONTAL_SPLIT);
upSplitPane.setLeftComponent(btnPane);
upSplitPane.setRightComponent(testDataPane);
JScrollPane downPane = newJScrollPane(textPane);
Dimension minimumSize = new Dimension(130,100);
btnPane.setMinimumSize(minimumSize);
textPane.setMinimumSize(new Dimension(100,100));
upSplitPane.setDividerLocation(270);
upSplitPane.setPreferredSize(newDimension(500, 300));
JSplitPane bigSplitPane = newJSplitPane(JSplitPane.VERTICAL_SPLIT, upSplitPane, downPane);
bigSplitPane.setDividerLocation(190);
add(bigSplitPane);
setSize(new Dimension(500, 400));
setVisible(true);
}
private void setUpButtonPanel(){
lblTestcases = new JLabel("TestCases:");
cmbTestcases = new JComboBox();
cmbTestcases.addItem(CASE_BUBBLE);
cmbTestcases.addItem(CASE_HEAP);
cmbTestcases.addItem(CASE_INSERTION);
//Create the open button
JButton executeBtn = new JButton(EXECUTE);
executeBtn.setMnemonic(KeyEvent.VK_S);
JButton exitButton = new JButton(EXIT);
exitButton.setMnemonic(KeyEvent.VK_X);
BtnListener objButtonHandler = newBtnListener();
// add action Listener
executeBtn.addActionListener(objButtonHandler);
exitButton.addActionListener(objButtonHandler);
buttonPanel = new JPanel();
GridBagLayout gridbag = newGridBagLayout();
buttonPanel.setLayout(gridbag);
GridBagConstraints gbc = newGridBagConstraints();
buttonPanel.add(lblTestcases);
buttonPanel.add(cmbTestcases);
buttonPanel.add(executeBtn);
buttonPanel.add(exitButton);
gbc.insets.top = 5;
gbc.insets.bottom = 5;
gbc.insets.left = 5;
gbc.insets.right = 5;
gbc.anchor = GridBagConstraints.EAST;
gbc.gridx = 0;
gbc.gridy = 0;
gridbag.setConstraints(lblTestcases, gbc);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 1;
gbc.gridy = 0;
gridbag.setConstraints(cmbTestcases, gbc);
gbc.anchor = GridBagConstraints.EAST;
gbc.insets.left = 2;
gbc.insets.right = 2;
gbc.insets.top = 25;
gbc.anchor = GridBagConstraints.EAST;
gbc.gridx = 0;
gbc.gridy = 7;
gridbag.setConstraints(executeBtn, gbc);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 1;
gbc.gridy = 7;
gridbag.setConstraints(exitButton, gbc);
}
public void showTestInfo(int[] str ){
txtTestInfo.setText("");
for(int n=0; n< str.length; n++)
txtTestInfo.append(""+str[n]+" ");
}
public void showErrors(String err){
txtTestcase.append(err+"\n");
}
public String getSelectedTestcase() {
return (String)cmbTestcases.getSelectedItem();
}
class BtnListener implements ActionListener{
private Testcase test;
private String selectedTestcase;
public void actionPerformed(ActionEvent e){
String searchResult = null;
int[] output=null;
if (e.getActionCommand().equals(EXIT)){
System.exit(1);
}
if(e.getActionCommand().equals(EXECUTE)){
selectedTestcase = getSelectedTestcase();
if(selectedTestcase.equals(CASE_BUBBLE))
test = new TestcaseBubble();
else if(selectedTestcase.equals(CASE_HEAP))
test = new TestcaseHeap();
elseif(selectedTestcase.equals(CASE_INSERTION))
test = new TestcaseInsertion();
output = test.execute(3000);
showTestInfo(output);
}
showErrors(selectedTestcase);
boolean result =ResultVerification.isResultCorrect(output );
showErrors("No Error found =" +result);
long timeTaken = test.getTimeTaken();
showErrors("Testing Time takes =" + timeTaken+"\n");
}
} // End of class BtnListener
private static void createAndShowGUI(){
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("LayeredArchitecture- Software Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TestingGUI newContentPane = newTestingGUI();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
static public void main(String argv[]) {
javax.swing.SwingUtilities.invokeLater(newRunnable() {
public void run() {
createAndShowGUI();
}
});
}
}
public class ResultVerification{
static boolean flag = true;
public static booleanisResultCorrect(int[] arr){
for(int k=0; k<arr.length-1; k++){
if(arr[k] > arr[k+1]){
flag=false;
System.out.println("error "+ k);
//break;
}
}
return flag;
}
}
第二层为測试案例层,包含软件測试project师所编写的測试案例
publicinterface Testcase{
public abstract int[] execute(int len);
public abstract long getTimeTaken();
}
class Context {
SortAlgorithm alg;
// Constructor
public Context(SortAlgorithm alg) {
this.alg = alg;
}
public int[] sortIntArray(int[] a) {
return this.alg.sort(a);
}
}
import java.util.Random;
public class IntegerArrGenerator{
public static int[] generateInput(int len){
int[] input= new int[len];
Random r = new Random();
for(int m=0; m< len; m++){
input[m] = r.nextInt(len);
}
return input;
}
}
import java.util.*;
public class TestcaseBubbleimplements Testcase{
private long startTime;
private long timeTaken=0;
public int[] execute(int len) {
startTime = System.currentTimeMillis();
int[] input =IntegerArrGenerator.generateInput(len);
SortAlgorithm sa = new BubbleSort();
Context context = new Context(sa);
int[] intArray = context.sortIntArray(input);
timeTaken =System.currentTimeMillis() - startTime;
return intArray;
}
public long getTimeTaken(){
return timeTaken;
}
}
import java.util.*;
public class TestcaseHeapimplements Testcase{
//static long time;
private long startTime;
private long timeTaken=0;
public int[] execute(int len){
startTime= System.currentTimeMillis();
int[]input = IntegerArrGenerator.generateInput(len);
SortAlgorithmsa = new HeapSort();
Contextcontext = new Context(sa);
int[]intArray = context.sortIntArray(input);
timeTaken= System.currentTimeMillis()-startTime;
return intArray;
}
public long getTimeTaken(){
return timeTaken;
}
}
import java.util.*;
public class TestcaseInsertionimplements Testcase{
private long startTime;
private long timeTaken=0;
public int[] execute(int len){
startTime = System.currentTimeMillis();
int[] input =IntegerArrGenerator.generateInput(len);
SortAlgorithm sa = new InsertSort();
Context context = new Context(sa);
int[] intArray = context.sortIntArray(input);
timeTaken =System.currentTimeMillis()-startTime;
return intArray;
}
public long getTimeTaken(){
return timeTaken;
}
}
第三层为被測试软件层(排序算法)
public interface SortAlgorithm {
int[] sort(int[] nums);
}
public class BubbleSort implementsSortAlgorithm {
public int[] sort(int[] nums){
for(int i = nums.length; --i >= 0;)
for(int j = 0; j < i; j++){
if(nums[j] > nums[j + 1]){
//exchange nums[j+1] withnums[j]
int T =nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = T;
}
}
return nums;
}
}
public class HeapSort implementsSortAlgorithm{
public int[] sort(int nums[ ]) {
for(int i=nums.length; i>1; i--){
buildBinaryHeapTree(nums, i -1);
swapLeadingNodeWithLastNode(nums, i - 1);
}
return nums;
}
public void buildBinaryHeapTree(intarray[], int arrayBound){
int leftChild, rightChild, biggerChild,temp;
int root = (arrayBound-1)/2;
// Find the bigger child index
for(int i=root; i>=0; i--) {
leftChild = (2*i)+1;
rightChild = (2*i)+2;
if((leftChild <= arrayBound)&& (rightChild <= arrayBound)){
if(array[rightChild] >=array[leftChild])
biggerChild =rightChild;
else
biggerChild = leftChild;
}
else{
if(rightChild >arrayBound)
biggerChild = leftChild;
else
biggerChild = rightChild;
}
//swap the integer contained inthe bigger child index
//with that in the currentparent node
if(array[i] <array[biggerChild]){
temp = array[i];
array[i] =array[biggerChild];
array[biggerChild] = temp;
}
}
return;
}
publicstatic void swapLeadingNodeWithLastNode(int array[], int arrayBound){
int temp;
temp = array[0];
array[0] = array[arrayBound];
array[arrayBound] = temp;
return;
}
}
public class InsertSortimplements SortAlgorithm {
public int[] sort(int[] nums){
for (int i = 1; i < nums.length;i++){
int j = i;
int numToBeInserted = nums[i];
while ((j > 0) &&(nums[j-1] > numToBeInserted) ) {
nums[j] = nums[j-1];
j--;
}
nums[j] = numToBeInserted;
}
return nums;
}
}
层次风格