今天尝试使用visio画了一个序列图。

话不多说,先打开visio,新建一个UML序列。

4b50bea38a9b6f205f2cdff941f4c021455.jpg

先新建几个对象生命线

e545a3522ac673b7a96c3400187317944f2.jpg

加入几个激活

2fcfb3b83dbbfc1d7a952e247a5a39ce6f8.jpg

而后是消息,实线表示请求,虚线表示响应。

 

6a74fce2624fbea874d427595ff321b7c64.jpg

当然如果不影响理解,可以不用每个请求都配上一个响应。

此UML例子是在《UML精粹:标准对象建模语言简明指南》中拿过来的,为了更好的理解这个UML,下面使用java来实现此UML。

ps,源码上传到码云了。https://gitee.com/xixiw777/sequenceDiagramhttps://gitee.com/xixiw777/sequenceDiagram

  • procuct
package com.simon.uml.sequenceDiagram;

/**
 * Created by IntelliJ IDEA.
 *
 * @author: Simon
 * @date: 2019-05-09
 * @time: 14:50
 * @description:产品
 */
public class Product {
    private String name;
    private double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public double getPrice(int number) {
        double orderLinePrice = price * number;
        System.out.println("product name:" + getName()
                + "\tprice:" + getPrice()
                + "\tnumber:" + number
                + "\torder line price:" + orderLinePrice
        );
        return orderLinePrice;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}
  • customer
package com.simon.uml.sequenceDiagram;

/**
 * Created by IntelliJ IDEA.
 *
 * @author: Simon
 * @date: 2019-05-09
 * @time: 14:51
 * @description:客户
 */
public class Customer {
    private double discount;

    public double getDiscountedValue(Order order) {
        return discount * order.getBaseValue();
    }

    public double getDiscount() {
        return discount;
    }

    public void setDiscount(double discount) {
        this.discount = discount;
    }
}
  • order
package com.simon.uml.sequenceDiagram;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @author: Simon
 * @date: 2019-05-09
 * @time: 14:50
 * @description:订单
 */
public class Order {
    private double baseValue;
    private Customer customer;
    private List<OrderLine> orderLineList;

    public double calculatePrice() {
        double sumOrderLinePrice = 0;
        for (OrderLine orderLine : orderLineList) {
            double orderLinePrice = orderLine.calculatePrice();
            sumOrderLinePrice += orderLinePrice;
        }
        this.setBaseValue(sumOrderLinePrice);
        System.out.println("order base price:" + sumOrderLinePrice);
        double discountedValue = getCustomer().getDiscountedValue(this);
        System.out.println("order discounted price:" + discountedValue);
        return discountedValue;
    }

    public double getBaseValue() {
        return baseValue;
    }

    public void setBaseValue(double baseValue) {
        this.baseValue = baseValue;
    }

    public List<OrderLine> getOrderLineList() {
        return orderLineList;
    }

    public void setOrderLineList(List<OrderLine> orderLineList) {
        this.orderLineList = orderLineList;
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
}

order line

package com.simon.uml.sequenceDiagram;

/**
 * Created by IntelliJ IDEA.
 *
 * @author: Simon
 * @date: 2019-05-09
 * @time: 14:50
 * @description:订单明细
 */
public class OrderLine {
    private int number;
    private Product product;

    public OrderLine(int number, Product product) {
        this.number = number;
        this.product = product;
    }

    public double calculatePrice() {
        return product.getPrice(number);
    }


    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }
}

 

  • order的测试用例

package com.simon.uml.sequenceDiagram;

import org.junit.Assert;

import java.util.ArrayList;
import java.util.List;


/**
 * Created by IntelliJ IDEA.
 *
 * @author: Simon
 * @date: 2019-05-09
 * @time: 15:23
 * @description:
 */
public class OrderTest {

    @org.junit.Test
    public void calculatePrice() {
        //这个商品是鞋子,123块钱一双
        Product productShoes = new Product();
        productShoes.setName("shoes");
        productShoes.setPrice(123);
        //这个商品是袜子,8块钱一双
        Product productSocket = new Product();
        productSocket.setName("socket");
        productSocket.setPrice(8);
        //这是一个老客户,打七折
        Customer customer = new Customer();
        customer.setDiscount(0.7);
        //这个客户下了一个单
        Order order = new Order();
        order.setCustomer(customer);
        //买了一双鞋子,两双袜子
        OrderLine orderLineShoes = new OrderLine(1, productShoes);
        OrderLine orderLineSocket = new OrderLine(2, productSocket);
        List<OrderLine> orderLineList = new ArrayList<OrderLine>();
        orderLineList.add(orderLineShoes);
        orderLineList.add(orderLineSocket);
        order.setOrderLineList(orderLineList);
        //算一算总共多少钱
        double priceActual = order.calculatePrice();
        Assert.assertEquals("97.3", String.valueOf(priceActual));
    }
}
  • 测试用例的输出

product name:shoes     price:123.0    number:1    order line price:123.0
product name:socket    price:8.0        number:2    order line price:16.0
order base price:139.0
order discounted price:97.3

转载于:https://my.oschina.net/u/3301706/blog/3047521