阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第24章:UML图形:课时107:类图

UML是统一的建模语言,本质就是利用图形化的形式来实现程序类关系的描述。在之前已经画出了大量的图形,这些图形都是按照UML标准进行的,并且最早并且使用最广泛的设计工具:Rational Rose,而后出现越来越多的设计工具,而像PowerDesigner也可以实现这些类图的定义。

类图描述

一般情况如果要想进行类结构的描述,往往可以使用三层的结构来表示:
在这里插入图片描述
如果要是一个普通类的名称,往往直接编写即可,而如果是抽象类,往往使用斜体描述。“类名称”,所以为了更加清楚描述,往往在抽象类上再加一个“abstract”。
对于类中的属性可以使用“访问权限 属性名称 : 属性类型”的格式来进行定义,而对于访问权限基本上重点只考虑三个:public(+)、protected(#)、private(-)。
类中的方法采用的格式“访问权限 方法名称() : 返回值”结构耿描述,一般的方法都是public声明。
开发都可以随意找到一些小的免费的开发工具,本次使用的是PowerDesigner工具进行设计。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在进行类图定义的时候可以设置类中的属性(Attributes)、类中支持的方法(Operations)。
在这里插入图片描述
在类图之中进行方法创建的时候必须先创建方法,而后通过属性才可以设置它的参数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
子类现实接口使用的是“三角和虚线”:在这里插入图片描述
类的继承使用的是“三角和实线”:在这里插入图片描述
在这里插入图片描述
实际的项目开发之中,如果花费大量的人力进行这样的设计一定是没有意义的(一定是无用功),所以一般会将程序的代码通过转换引擎变为图形显示。
在这里插入图片描述
在这里插入图片描述

interface ILink<E> {         //设置泛型避免安全隐患
	public void add(E e) ;   //增加数据
	public int size() ;    //获取数据的个数
	public boolean isEmpty() ;   //判断是否空集合
	public Object[] toArray() ;     //将集合元素以数组的形式返回
	public E get(int index) ;   //根据索引获取数据
	public void set(int index,E data) ;    //修改索引数据
	public boolean contains(E data) ; //判断数据是否存在
	public void remove(E e) ;        //数据删除
	public void clean() ;    //清空集合
}
class LinkImpl<E> implements ILink<E> {
	private class Node {         //保存节点的数据关系
		private E data ;      //保存数据
		private Node next ;       //保存下一个引用
		public Node(E data) {          //有数据的情况下才有意义
			this.data = data ;
		}
		//第一次调用:this = LinkImpl.root ;
		//第二次调用:this = LinkImpl.root.next ;
		//第三次调用:this = LinkImpl.root.next.next ;
		public void addNode(Node newNode){      //保存新的Node数据
			if (this.next == null) {   //当前节点的下一个节点为null
				this.next = newNode;      //保存当前节点
			}else {
				this.next.addNode(newNode);
			}
		}
		//第一次调用:this = LinkImpl.root
		//第二次调用:this = LinkImpl.root.next
		//第三次调用:this = LinkImpl.root.next.next
		public void toArrayNode() {
			LinkImpl.this.returnData [LinkImpl.this.foot ++] = this.data ;
			if (this.next != null) {     //还有下一个数据
				this.next.toArrayNode() ;
			}
		}
		public E getNode(int index) {
			if (LinkImpl.this.foot ++ == index) {       //索引相同
				return this.data ;    //返回当前数据
			}else {
				return this.next.getNode(index) ;
			}
		}
		public void setNode(int index,E data) {
			if (LinkImpl.this.foot ++ == index) {       //索引相同
				this.data = data ;    //修改数据
			}else {
				this.next.setNode(index,data) ;
			}
		}
		public boolean containsNode(E data) {
			if (data.equals(this.data)) {    //对象比较
				return true ;
			}else {
				if (this.next == null) {         //没有后续节点
					return false ;   //找不到
				}else {
					return this.next.containsNode(data) ;   //向后继续判断 
				}
			}
		}
		public void removeNode(Node<E> previous,E data) {
			if (this.data.equals(data)) {
				previous.next = this.next ;
			}else {
				if (this.next!=null) {
					this.next.removeNode(this,data) ;
				}
			}
		}
		public void removeNode (Node previous,E data) {
			if (this.data.equals(data)) {
				previous.next = this.next ;    //空出当前节点
			}else {
				if (this.next != null) {       //有后续节点
					this.next.removeNode(this, data) ;    //向后继续删除
				}
			}
		}
	}
	//------------以下为Link类中定义的成员-----------------
	private Node root ;       //保存根元素
	private int count ;     //保存数据的个数
	private int foot ;     //描述的是操作数组的脚标
	private Object[] returnData ;   //返回的数据保存
	//------------以下为Link类中定义的方法-----------------
	public void add(E e){
		if(e == null){
			return ;
		}
		//数据本身是不具有关联特性的,只有Node类有,要想关联处理就必须将数据包装在Node类中
		Node newNode = new Node(e);    //创建一个新的节点
		if (this.root == null){            //现在没有根节点
			this.root = newNode;       //第一个节点作为根节点
		}else{                          //根节点存在
			this.root.addNode(newNode);       //将新节点保存在合适的位置
		}   
		this.count++ ;  
	}
	public int size() {
		return this.count ;
	}
	public boolean isEmpty() {
		//return this.root == null ;
		return this.count == 0 ;
	}
	public Object[] toArray() {
		if (this.isEmpty()) {           //空集合
		return null ;      //现在没有数据
		}
		this.foot = 0 ;  //脚标清零
		this.returnData = new Object[this.count] ;   //根据已有的长度开辟数组
		this.root.toArrayNode() ; //利用Node类进行递归数据获取
		return this.returnData ;
	}
	public E get(int index) {
		if (index >= this.count) {    //索引应该在指定的范围之内
			return null ;
		}    //索引数据的获取应该由Node类完成
		this.foot = 0 ;   //重置索引的下标
		return this.root.getNode(index) ;
	}
	public void set(int index,E data) {
		if (index >= this.count) {    //索引应该在指定的范围之内
			return  ;     //方法结束
		}    //索引数据的获取应该由Node类完成
		this.foot = 0 ;   //重置索引的下标
		this.root.setNode(index,data) ;  //修改数据
	}  
	public boolean contains(E data) {
		if (data == null) {
			return false ;     //没有数据
		}
		return this.root.containsNode(data) ;    //交给Node类判断
	}
	public void remove(E data) {
		if (this.contains(data)) {     //判断数据是否存在
			if (this.root.data.equals(data)) {       //根节点为要删除节点
				this.root = this.root.next ;    //根的下一个节点  
			}else {         //交由Node类进行删除
				this.root.next.removeNode(this.root , data) ;
			}
			this.count -- ;
		}
	}
	public void clean() {
		this.root = null ;  //后续的所有节点都没了
		this.count = 0 ;   //个数清零
	}
}
interface IGoods{    //定义商品标准
	public String getName();
	public double getPrice();
}
interface IShopCar{       //购物车
	public void add(IGoods goods);   //添加商品信息
	public void delete(IGoods goods); //删除商品
	public Object [] getAll();   //获得购物车中全部商品信息
}
interface ICashier{
	public int getNumber();
	public double getPrice(); 
}
class ShopCarImpl implements IShopCar{   //购物车
	ILink<IGoods> allGoodseses = new LinkImpl<IGoods>() ;
	public void add(IGoods goods) {
		this.allGoodseses.add(goods);
	}
    public void delete(IGoods goods) {
        this.allGoodses.remove(goods);
	}
    public Object [] getAll() {
        return this.allGoodses.toArray();
	}
}
class Cashier {     //收银台
	private IShopCar shopcar;
	public Cashier(IShopCar shopcar) {
        this.shopcar = shopcar;
    }
	public double allPrice() {    //计算总价
		double all =0.0;
		Object result [] = this.shopcar.getAll() ;
        for(Object obj : result) {
			IGoods goods = (IGoods)obj;
			all += goods.getPrice();
		}
		return all ;
	}
	public int allCount() {    //商品数量
		return this.shopcar.getAll().length;
	}
}
class Bag implements IGoods{
	private String name;
	private double price;
	public Bag(String name,double price) {
		this.name = name;
		this.price = price;
	}
	public String getName() {
		return this.name;
	}
	public double getPrice() {
		return this.price;
	}
	public boolean equals(Object obj) {
		if(obj == null) {
			return false;
		}
		if(this == obj){
			return true;
		}
		if(!(obj instanceof Bag)) {
			return false;
		}
		Bag bag = (Bag) obj;
		return this.name.equals(bag.name) && this.price == bag.price;
	}
	public String toString() {
		return "【背包信息】名称:"+this.name + "、价格:"+this.price;
	}
}
class Book implements IGoods {
	private String name ;
	private double price ;
	public Book(String name,double price) {
		this.name = name ;
		this.price = price ;
	}
	public String getName() {
		return this.name;
	}
	public double getPrice() {
		return this.price;
	}
	public boolean equals(Object obj) {
		if(obj == null) {
			return false;
		}
		if(this == obj){
			return true;
		}
		if(!(obj instanceof Book)) {
			return false;
		}
		Book book = (Book) obj;
		return this.name.equals(book.name) && this.price == book.price;
	}
	public String toString() {
		return "【图书信息】名称:"+this.name + "、价格:"+this.price;
	}
}
public class JavaDemo{
	public static void main(String args[]) {
		IShopcar car = new ShopCarImpl();
		car.add(new Book("Java开发",79.8));
		car.add(new Book("Oracle ",89.8));
		car.add(new Bag("小强背包",889.8));
		Cashier cas = new Cashier(car);
		System.out.println("总价格:"+cas.allPrice ()+"、购买总数量:"+cas.allCount ());
	}
}

在这里插入图片描述注:以上代码在网上查找的,编译有问题,希望有人能指导,谢谢。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值