【Java设计模式】软件设计七大原则

软件设计原则的分类

  1. 开闭原则
  2. 依赖倒置原则
  3. 单一职责原则
  4. 接口隔离原则
  5. 迪米特法则(最少知道原则)
  6. 里氏替换原则
  7. 合成/复用原则(组合/复用原则)

在设计模式中会有这7中软件设计原则的体现,但是值得注意的是这7钟设计原则在设计模式中的使用是有取舍的,有的可能是完整的体现,也可能是部分地体现设计原则;有的可能使用了,有的可能没有使用等。
软件设计原则的学习应为软件设计模式的学习打好基础

开闭原则

定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

核心思想:用抽象构建框架,用实现扩展细节

优点:提高软件系统的可复用性及可维护性

开闭原则是面向对象最基础的设计原则,它能够帮助我们开发稳定灵活的系统

下面来演示一下:
场景描述:现在要卖“雪花酥”小蛋糕大礼包,雪花酥小蛋糕大礼包的属性有编号,价格,口味。

首先定义一个接口:

package softwaredesign;

public interface ICake {
    Integer getID();
    String getTaste();
    Double getPrice();
}

实现类

package softwaredesign;

public class SnowCake implements ICake {
    private Integer id;
    private String taste;
    private Double price;

    public SnowCake(Integer id, String taste, Double price) {
        this.id = id;
        this.taste = taste;
        this.price = price;
    }

    @Override
    public Integer getID() {
        return this.id;
    }

    @Override
    public String getTaste() {
        return this.taste;
    }

    @Override
    public Double getPrice() {
        return this.price;
    }

    @Override
    public String toString() {
        return "SnowCake{" +
                "id=" + id +
                ", taste='" + taste + '\'' +
                ", price=" + price +
                '}';
    }
}

测试:

package softwaredesign;

public class Test {
    public static void main(String[] args) {
        SnowCake sc = new SnowCake(100,"原味",55.0);
        System.out.println(sc);
    }
}

结果是正常的
转换成UML图:
在这里插入图片描述
在这里插入图片描述
从类结构图中 很容易类结构的信息

最近618 淘宝也搞活动了雪花酥要进行打8折了。

这个时候的开发要注意了 不要动接口 不要动接口 接口作为契约应该是可靠的,稳定的。

添加一个类

package softwaredesign;

public class SnowCakeDiscount extends SnowCake {
    public SnowCakeDiscount(Integer id, String taste, Double price) {
        super(id, taste, price);
    }

    @Override
    public Integer getID() {
        return super.getID();
    }

    @Override
    public String getTaste() {
        return super.getTaste();
    }

    @Override
    public Double getPrice() {
        return super.getPrice()*0.8;
    }

    @Override
    public String toString() {
        return "SnowCake{" +
                "id=" + super.getID() +
                ", taste='" + super.getTaste()+ '\'' +
                ", price=" + super.getPrice()*0.8 +
                '}';
    }
}

测试

package softwaredesign;

public class Test {
    public static void main(String[] args) {
        SnowCake sc = new SnowCakeDiscount(100,"原味",55.0);
        System.out.println(sc);
    }
}

在这里插入图片描述
在这里插入图片描述
上述是UML图

依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象

抽象不应该依赖细节;细节应该依赖抽象

针对接口编程,不要针对实现编程

注意
每个类都尽量继承自接口或者抽象类(可以继承抽象类实现接口方法)
尽量不要从具体的类派生
尽量不要覆盖其基类的方法

优点:
可以减少类间的耦合性、提高系统稳定性,提高代码可读性和可维护性,可降低修改程序所造成的风险

下面来演示一下:
小明对淘宝上卖的鼠标 和 键盘都比较感兴趣

首先演示一个面向实现编程的例子
Buy类

package softwaredesign;

public class Buy {
    public void buyMouse(){
        System.out.println("小明在买鼠标");
    }
    public void buyKeyboard(){
        System.out.println("小明在买键盘");
    }
}

Test

package softwaredesign;

public class Test {
    public static void main(String[] args) {
       Buy buy = new Buy();
       buy.buyMouse();
       buy.buyKeyboard();
    }
}

假如小明又想买 鼠标垫
在Buy类中添加

public void buyMousePad(){
	System.out.println("小明在买键盘垫");
}

就是妥妥的面向实现编程
这个是与 依赖倒置 原则 是背道而驰的

高层次的模块不应该依赖低层次的模块

下面演示 满足依赖倒置原则的情况
创建一个Things接口

package softwaredesign;

public interface Things {
    void buyThins();
}

继承接口的类:

package softwaredesign;

public class BuyMouse implements Things {
    @Override
    public void buyThins() {
        System.out.println("小明正在买鼠标");
    }
}
package softwaredesign;

public class BuyKeyboard implements Things {
    @Override
    public void buyThins() {
        System.out.println("小明正在买键盘");
    }
}

将继承接口的类联系起来

package softwaredesign;

public class Buy {
    public void buy(Things things){
        things.buyThins();
    }
}

测试

package softwaredesign;

public class Test {
    public static void main(String[] args) {
       Buy b = new Buy();
       b.buy(new BuyMouse());
       b.buy(new BuyKeyboard());
    }
}

打印结果与前面面向实现的结果是一样的

我们看一下类图:
在这里插入图片描述
如果有拓展的要买的东西 都和BuyMouse和BuyKeyboard平级了

具体的实现类 Buy类是不需要动的

也就是说我们面向接口编程, 不需要变动实现类

这里的Test测试类 和 Buy类是解耦的


当然也可以通过构造器注入 来进行Buy的实现
没有改动的

package softwaredesign;

public class Buy {
    public void buy(Things things){
        things.buyThins();
    }
}

改动后

package softwaredesign;

public class Buy {
    private Things things;

    public Buy(Things things){
        this.things = things;
    }

    public void buy(){
        things.buyThins();
    }
}

具体的测试

package softwaredesign;

public class Test {
    public static void main(String[] args) {
       Buy b = new Buy(new BuyMouse());
       b.buy();
    }
}

构造器使用方式并不是非常方便 需要拓展的时候 还有new一个出来Buy实现类
在Spring框架中默认的设计模式是 单例模式


之前是构造器方式
现在取消构造器方式 改用Setter方法
修改Buy类

package softwaredesign;

public class Buy {

    private Things things;

    public void setThings(Things things) {
        this.things = things;
    }

    public void buy(){
        things.buyThins();
    }
}

测试

package softwaredesign;

public class Test {
    public static void main(String[] args) {
       Buy b = new Buy();
       b.setThings(new BuyMouse());
       b.buy();
    }
}

看看现在的类图
在这里插入图片描述
Buy类不依赖与任何继承Things的类

单一职责原则

定义:不要存在多于一个导致类变更的原因

一个类/接口/方法只负责一项职责

优点:降低类的复杂度、提高类的可读性,提高系统的可维护性、降低变更引起的风险

下面进行演示:
创建一个鸟类 违反单一原则

package softwareDesign;

public class Bird {
    public void mainMoveMode(String birdName){
        if ("变色龙".equals(birdName)){
            System.out.println("变色龙用四肢走");
        }else {
            System.out.println(birdName+"用翅膀飞");
        }
    }
}

测试

package softwareDesign;

public class Test {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.mainMoveMode("猫头鹰");
        bird.mainMoveMode("变色龙");
    }
}

假如又要添加新的东西 又要去动Bird类了(因为Bird类负责的职责较多),随着代码的复杂,越动出错的风险越大

改变:

package softwareDesign;

public class FlyBird {
    public void mainMoveMode(String birdName) {
        System.out.println(birdName + "用翅膀飞");
    }
}
package softwareDesign;

public class WalkAnimal {
    public void mainMoveMode(String Name) {
        System.out.println(Name + "用四肢走");
    }
}
package softwareDesign;

public class Test {
    public static void main(String[] args) {
        FlyBird flyBird = new FlyBird();
        WalkAnimal walkAnimal = new WalkAnimal();
        //应用层判断
        flyBird.mainMoveMode("猫头鹰");
        walkAnimal.mainMoveMode("变色龙");
    }
}

我们来看一下类图
在这里插入图片描述
当然还有接口 以及 方法的情况
结合上面的示例 这个都很好理解的

接口隔离原则

定义:用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口

一个类对一个类的依赖应该建立在最小的接口上

建立单一接口,不要建立庞大臃肿的接口尽量细化接口,接口中的方法尽量少

尽量细化接口,接口中的方法尽量少

注意适度原则,一定要适度

优点:符合我们常说的高内聚低耦合的设计思想从而使得类具有很好的可读性、可扩展性和可维护性。

比如说 一个接口中定义了eat() fly() swim()
狗继承了这个接口 但是多了一个fly()
猫头鹰记录了这个接口 但是多一个swim()
它们都要空实现

如果要符合接口隔离原则,需要为fly(0 eat()
和 swim() eat() 或者 为fly() eat() swim()分别定义一个接口

但是一定要适度适度 差不多细化就行了 否则会导致接口过多 反而增大开发难度

迪米特法则(最少知道原则)

定义:一个对象应该对其他对象保持最少的了解。又叫最少知道原则

尽量降低类与类之间的耦合

优点:降低类之间的耦合、

这个也是需要适度的!!!

强调只和朋友交流,不和陌生人说话

朋友:
出现在成员变量、方法的输入、输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。

演示
不符合迪米特法则的情形:

package softwareDesign;

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

public class Boss {
    public void commandCheckNumber(TeamLeader teamLeader){
        List<Project> list = new ArrayList<>();
        for (int i = 0; i <3 ; i++) {
            list.add(new Project());
        }
        teamLeader.checkNumberOfProject(list);
    }
}
package softwareDesign;

import java.util.List;

public class TeamLeader {
    public void checkNumberOfProject(List<Project> projectList){
        System.out.println("项目数量是: "+projectList.size());
    }
}

package softwareDesign;

public class Project {
}

测试

package softwareDesign;

public class Test {
    public static void main(String[] args) {
        Boss boss = new Boss();
        TeamLeader teamLeader = new TeamLeader();
        boss.commandCheckNumber(teamLeader);
    }
}

我们看看它的类图
在这里插入图片描述
从代码中可以分析出
Boss类中 可以跟Project类没有关系的 直接调用TeamLeader就行了

修改:

package softwareDesign;

public class Boss {
    public void commandCheckNumber(TeamLeader teamLeader){
        teamLeader.checkNumberOfProject();
    }
}

package softwareDesign;

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

public class TeamLeader {
    public void checkNumberOfProject(){
        List<Project> list = new ArrayList<>();
        for (int i = 0; i <3 ; i++) {
            list.add(new Project());
        }
        System.out.println("项目数量是: "+list.size());
    }
}

package softwareDesign;

public class Project {
}

测试

package softwareDesign;

public class Test {
    public static void main(String[] args) {
        Boss boss = new Boss();
        TeamLeader teamLeader = new TeamLeader();
        boss.commandCheckNumber(teamLeader);
    }
}

只有 Boss和TeamLeader类 做了改动
下面是类图:
在这里插入图片描述

里氏替换原则

定义:
如果对每一个类型为T1的对象o1,都有类型为T2的对象02,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。

定义扩展:
一个软件实体如果适用一个父类的话,那一定适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变。

引申意义:子类可以扩展父类的功能,但不能改变父类原有的功能。
◆含义1:子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
◆含义2:子类中可以增加自己特有的方法。

结合"开闭原则"举的例子 可以很容易看出来 前两条的出入

◆含义3:当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法的输入参数更宽松。
◆含义4:当子类的方法实现父类的方法时(重写/重载或实现抽象方法)方法的后置条件(即方法的输出/返回值)要比父类更严格或相等。

它的优点:
◆优点1:约束继承泛滥,开闭原则的一种体现。
◆优点2:加强程序的健壮性,同时变更时也可以做到非常好的兼容性提高程序的维护性、扩展性。降低需求变更时引入的风险。

演示:
Rectangle.java

package softwareDesign;

public class Rectangle {
    private long length;
    private long width;

    public long getLength() {
        return length;
    }

    public long getWidth() {
        return width;
    }

    public void setLength(long length) {
        this.length = length;
    }

    public void setWidth(long width) {
        this.width = width;
    }
}

Squre.java

package softwareDesign;

public class Square extends Rectangle{
    private long sideLength;

    public long getSideLength() {
        return sideLength;
    }

    public void setSideLength(long sideLength) {
        this.sideLength = sideLength;
    }

    @Override
    public long getLength() {
        return getSideLength();
    }

    @Override
    public long getWidth() {
        return getLength();
    }

    @Override
    public void setLength(long length) {
       setSideLength(length);
    }

    @Override
    public void setWidth(long width) {
        setSideLength(width);
    }
}

Test.java

package softwareDesign;

public class Test {
    public static void resize(Rectangle rectangle) {
        while (rectangle.getWidth()<=rectangle.getLength()){
            rectangle.setWidth(rectangle.getWidth()+1);
            System.out.println("width:"+rectangle.getWidth()+" length:"+rectangle.getLength());
        }
        System.out.println("方法结束:width:"+rectangle.getWidth()+" length:"+rectangle.getLength());
    }

    public static void main(String[] args){
        Rectangle rectangle = new Rectangle();
        rectangle.setWidth(10);
        rectangle.setLength(20);
        resize(rectangle);
    }
}

注意测试的是 长方形的实例
如果换成了正方形 那么这个程序将会永久的执行下去 直到溢出
不符合 里氏替换原则

我们可以改进一下:
我们可以创建一个基于长方形和正方形的父类:

package softwareDesign;

public interface QRangle {
    long getWidth();
    long getLength();
}

package softwareDesign;

public class Rectangle implements QRangle{
    private long length;
    private long width;

    public long getLength() {
        return length;
    }

    public long getWidth() {
        return width;
    }

    public void setLength(long length) {
        this.length = length;
    }

    public void setWidth(long width) {
        this.width = width;
    }
}
package softwareDesign;

public class Square implements QRangle{
    private long sideLength;

    public long getSideLength() {
        return sideLength;
    }

    public void setSideLength(long sideLength) {
        this.sideLength = sideLength;
    }

    public long getWidth() {
        return sideLength;
    }

    public long getLength() {
        return sideLength;
    }
}

这样子在测试中 使用之前的方式 会报错 因为他不满足里氏替换原则

合成/复用原则(组合/复用原则)

定义:尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的

聚合has-A和组合contains-A

优点:可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少

不满足的设计

package softwareDesign;

public class DBConnection {
    public String getConnection(){
        return "MySQL数据库连接";
    }
}

package softwareDesign;

public class ProductDao extends DBConnection {
    public void addProduct(){
        String conn = super.getConnection();
        System.out.println("使用"+conn+"增加产品");
    }
}

Test

package softwareDesign;

public class Test {

    public static void main(String[] args){
        ProductDao productDao = new ProductDao();
        productDao.addProduct();
    }
}

UML类图
在这里插入图片描述
如果又接入了别的数据库
我们能够直接修改DBConnection类
但是这样违反开闭原则

我们重构一下它 让它在具备扩展能力且不违反开闭原则,还遵守合成/复用原则
抽象类

package softwareDesign;

public abstract class DBConnection {
    public abstract String getConnection();
}

package softwareDesign;

public class MySQLConnection extends DBConnection{
    @Override
    public String getConnection() {
        return "MySQL数据库连接";
    }
}

package softwareDesign;

public class PostgreSQLConnection extends DBConnection {
    @Override
    public String getConnection() {
        return " PostgreSQL数据库连接";
    }
}

package softwareDesign;

public class ProductDao  {
    private DBConnection dbConnection;

    public void setDbConnection(DBConnection dbConnection) {
        this.dbConnection = dbConnection;
    }

    public void addProduct(){
        //通过组合的方式
        String conn =dbConnection.getConnection();
        System.out.println("使用"+conn+"增加产品");
    }
}

测试

package softwareDesign;

public class Test {

    public static void main(String[] args){
        ProductDao productDao = new ProductDao();
        productDao.setDbConnection(new MySQLConnection());
        productDao.addProduct();
    }
}

查看UML图
在这里插入图片描述
凡是拓展的都是第二层的平级

  • 181
    点赞
  • 929
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
这里边包括:第1章 Java图形用户界面编程 1实例1 布局管理 2实例2 设计软件启动界面 9实例3 实现多色窗口 11实例4 切分窗口 13实例5 丰富多彩的按钮 15实例6 在窗口中显示背景图 16实例7 在窗体中绘制图形 18实例8 利用JNI实现窗口特效 20实例9 文件选择对话框 24实例10 改变字体 26实例11 应用JTree 28实例12 应用JTable 30实例13 记事本 32实例14 使用JTextPane 36实例15 实现多文档视图 37实例16 使用进度条 39实例17 使用工具提示 42实例18 不同界面的风格 43第2章 Java的二维和三维图形处理 45实例19 颜色处理 46实例20 合成效果 47实例21 多种字体效果 49实例22 合成两个图片 53实例23 实现多种线形 58实例24 混合效果 62实例25 纹理与色彩处理 63实例26 实现填充效果 66实例27 变形与转换处理 67实例28 绘制弧线 69实例29 剪裁效果 74实例30 跳动的文字特效 78实例31 火焰与水纹特效 82实例32 盖房子特效 91实例33 旋转的方块特效 95实例34 光照效果特效 103第3章 Java输入/输出编程 109实例35 读取文件 110实例36 写入文件 111实例37 压缩文件 112实例38 打印文本文件 114实例39 读取配置文件 115实例40 流操作 117实例41 管道操作 118实例42 标准I/O重定向 121实例43 文件过滤器 122实例44 获取文件信息 123第4章 Java网络编程 125实例45 选择字体 126实例46 UDP与TCP/IP的简单应用 129实例47 聊天室 131实例48 浏览FTP 136实例49 局域网广播 147实例50 建立HTTP连接 151实例51 迷你浏览器 152实例52 扫描应用端口 154实例53 监控HTTP 155实例54 收发电子邮件 156实例55 一个简单的代理服务器 164实例56 扫描网站信息 173实例57 远程方法调用 174实例58 调用JINI方法 176第5章 Java数据库编程 179实例59 应用JDBC-ODBC桥 180实例60 使用单独JDBC连接驱动程序 184实例61 数据库基本操作 185实例62 使用游标 189实例63 使用事务 191实例64 实现SQL语句的检索功能 192实例65 SQL嵌套检索 194实例66 获取数据库基本信息 195第6章 Java C/S结构编程 197实例67 实现C/S多线程 198实例68 客户端程序 200实例69 服务器端程序 201实例70 C/S结构聊天室 203实例71 基于C/S的小游戏 209实例72 应用C/S数据库 237实例73 实现客户端程序 242实例74 实现一个简单的代理服务器 246实例75 C/S结构的分布式运算 248第7章 Java B/S结构编程 253实例76 简单的Servlet程序 254实例77 简单的留言簿 256实例78 JSP+Java Bean的计数器 258实例79 数据库查询 260实例80 文件的上传下载 262实例81 收发E-mail 267实例82 B/S结构的聊天室 269实例83 网上选课 276实例84 B/S结构的商业应用——购物车 282实例85 通过JSP调用Applet程序 285实例86 JSP与XML的结合 288第8章 Java安全控制编程 291实例87 控制访问权限 292实例88 产生密钥 296实例89 单钥加解密 299实例90 双钥加解密 301实例91 数字签名 303实例92 实现SSL协议 306实例93 简单的HTTPS服务 314第9章 Java Web Service编程 319实例94 使用DOM的层次模型 320实例95 使用SAX事件模型 324实例96 JAXP编程 327实例97 JDOM编程 331实例98 简单的SOAP应用 336实例99 访问SOAP RPC服务 339实例100 SOAP消息编程 342实例101 构建SOAP Script服务 347实例102 应用SOAP EJB Bean服务 354实例103 部署SOAP COM服务 358实例104 查询UDDI信息 364第10章 Java 2 Platform Enterprise Edition编程 367实例105 构建简单的EJB 368实例106 无状态会话Bean编程 371实例107 简单的累加器 374实例108 简单Bean管理的实体 377实例109 创建CMP EntityBean 386实例110 编写MessageDrivenBean 392实例111 使用JNDI 396实例112 各种EJB之间的调用过程 397实例113 使用B/S结构的EJB 402实例114 使用C/S结构的EJB组件服务 405实例115 与时间有关的函数 407实例116 EJB与UML的对应关系 412实例117 C/S结构的RMI-IIOP应用 414实例118 使用JTA与JTS 417实例119 Request-Reply模式的JMS应用 421实例120 使用Java IDL 426实例121 EJB与CORBA的交互 430实例122 基于EJB的真实世界模型 433实例123 EJB的商业应用——定购单 447第11章 Java 2 Platform Micro Edition编程 475实例124 插入和替换表单元素 476实例125 使用线程与定时 478实例126 J2ME绘图 480实例127 基于J2ME的小游戏 483实例128 建立无线HTTP连接 485实例129 收发短信 487实例130 获取基金报价 490第12章 JNI编程 493实例131 简单的JNI调用 494实例132 调用Windows API 495实例133 通过JNI运行OpenGL动画 496实例134 JNI与COM之间的调用 500实例135 隐藏Java控制台 502实例136 监控内存 505实例137 获取本机的Mac地址 508实例138 获取Java系统信息 509实例139 控制Java与C++程序的通信 510实例140 访问Windows注册表 514第13章 Java配置与集成 523实例141 J2SDK的安装配置 524实例142 使用第三方包 525实例143 安装配置Tomcat 526实例144 安装配置Apache 528实例145 安装配置WebLogic 529实例146 整合Tomcat与IIS 531实例147 整合Tomcat与Apache 532实例148 整合JBuilder与WebLocig 533实例149 安装、编译和执行一个MIDlet 535实例150 构造Jsp/javabean开发和发布环境 537 还包括第1章 记忆测试软件1.1. 设计内容1.2. 设计要求1.3. 总体设计1.4. 具体设计1.4.1. 运行效果与程序发布1.4.2. 主类Memory1.4.3. 方块 Block1.4.4. 记忆测试板MemoryTestPane1.4.5. 显示成绩 ShowRecord1.4.6. 记录成绩 Record1.4.7. 随机排列图标 RandomSetIcon1.4.8. 测试者 People1.5. 课程设计作业第2章 计算器2.1. 设计内容2.2. 设计要求2.3. 总体设计2.4. 具体设计2.4.1. 运行效果与程序发布2.4.2. 主类 ComputerPad2.4.3. 数值按钮NumberButton2.4.4. 运算符号按钮OperationButton2.5. 课程设计作业第3章 HANNOI-塔3.1. 设计内容3.2. 设计要求3.3. 总体设计3.4. 具体设计3.4.1. 运行效果与程序发布3.4.2. 主类 Tower3.4.3. Hannoi-塔 HannoiTower3.4.4. 塔点 TowerPoint3.4.5. 盘子 Disk3.5. 课程设计作业第4章 JPEG图象生成器4.1. 设计内容4.2. 设计要求4.3. 总体设计4.4. 具体设计4.4.1. 运行效果与程序发布4.4.2. 主类 MakeJPEG.java4.5. 课程设计作业第5章 标准化考试系统 (单机版)5.1. 设计内容5.2. 设计要求5.3. 总体设计5.4. 具体设计5.4.1. 运行效果与程序发布5.4.2. 主类EnglishTest5.4.3. 考试区域TestArea5.4.4. 读取试题 ReadTestquestion5.5. 课程设计作业第6章 标准化考试系统 (C/S网络版)6.1. 设计内容6.2. 设计要求6.3. 总体设计6.4. 具体设计6.4.1. 运行效果与程序发布6.4.2. 客户端主类Client6.4.3. 客户端选择试题界面ChoiceFile6.4.4. 客户端考试界面ClientTestArea6.4.5. 服务器端主类Server6.4.6. 服务器端读取试题 ReadTestquestion6.5. 课程设计作业第7章 标准化考试系统 (B/S网络版)7.1. 设计内容7.2. 设计要求7.3. 总体设计7.4. 具体设计7.4.1. 运行效果与程序发布7.4.2. 客户端主类ClientBS7.4.3. 客户端选择试题界面ChoiceFile7.4.4. 客户端考试界面ClientTestArea7.4.5. 服务器端主类Server7.4.6. 服务器端读取试题 ReadTestquestion7.5. 课程设计作业第8章 日历记事本8.1. 设计内容8.2. 设计要求8.3. 总体设计8.4. 具体设计8.4.1. 运行效果与程序发布8.4.2. 主类CalendarPad8.4.3. 记事本NotePad8.4.4. 年Year8.4.5. 月Month8.5. 课程设计作业18.6. 课程设计作业2第9章 学籍管理系统9.1. 设计内容9.2. 设计要求9.3. 总体设计9.4. 具体设计9.4.1. 运行效果与程序发布9.4.2. 主类StudentManager9.4.3. 录入界面StudentSituation9.4.4. 查询界面Inquest9.4.5. 修改界面ModifySituation9.4.6. 删除界面Delete9.4.7. 学生对象Student9.5. 课程设计作业第10章 图书查询系统 (B/S网络版)10.1. 设计内容10.2. 设计要求10.3. 总体设计10.4. 具体设计10.4.1. 运行效果与程序发布10.4.2. 客户端主类DatabaseClient10.4.3. 服务器端主类DatabaseServer10.5. 课程设计作业第11章 中国象棋打谱软件11.1. 设计内容11.2. 设计要求11.3. 总体设计11.4. 具体设计11.4.1. 运行效果与程序发布11.4.2. 主类 Chess11.4.3. 对弈棋盘ChessBoard11.4.4. 棋子ChessPiece11.4.5. 棋点 ChessPoint11.4.6. 走棋法则Rule11.4.7. 步骤MoveStep11.4.8. 记录棋谱MakeChessManual11.4.9. 棋谱演示Demon11.5. 课程设计作业111.6. 课程设计作业2第12章 魔板游戏12.1. 设计内容12.2. 设计要求12.3. 总体设计12.4. 具体设计12.4.1. 运行效果与程序发布12.4.2. 主类PuzzleFrame12.4.3. 魔板PuzzlePad12.4.4. 魔板中的点SquarePoint12.5. 课程设计作业第13章 挖雷游戏13.1. 设计内容13.2. 设计要求13.3. 总体设计13.4. 具体设计13.4.1. 运行效果与程序发布13.4.2. 主类Game13.4.3. 方块 Block13.4.4. 雷区 MineSquare13.4.5. 雷标数目 FindAroundMineMarkNumber13.4.6. 雷标判断 DetermineMineMarkIsRightOrWrong13.4.7. 成片挖开区域 DetermineDigArea13.4.8. 无雷连通区 FindSafeArea13.4.9. 随机布雷 RandomSetMine13.4.10. 周围地雷个数FindAroundMineNumber13.4.11. 显示剩余雷数CountMine13.4.12. 计时器TimeCount13.4.13. 英雄榜录入对话框Record13.4.14. 显示英雄榜对话框ShowRecord13.4.15. 挖雷成功DecideWinner13.5. 课程设计作业第14章 网络聊天室 (B/S模式)14.1. 设计内容14.2. 设计要求14.3. 总体设计14.4. 具体设计14.4.1. 运行效果与程序发布14.4.2. 客户端主类ClientChat14.4.3. 客户端输入妮称界面InputNameTextField14.4.4. 客户端聊天界面ChatArea14.4.5. 服务器端主类ChatServer14.5. 课程设计作业第15章 局域网络广播系统15.1. 设计内容15.2. 设计要求15.3. 总体设计15.4. 具体设计15.4.1. 运行效果与程序发布15.4.2. 客户端主类Receive15.4.3. 服务器端主类BroadCastWord15.5. 课程设计作业
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值