这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/2021Softwarecodedevelopmenttechnology/homework/11833 |
这个作业的目标 | 让学生了解和学习软件设计的原则、模式,并结合自身开发经历加深对相应知识的理解 |
参考书籍
《大话设计模式》---程杰
内容简介:书中以情景对话的形式,用多个小故事或代码生动形象地讲解了软件工程的设计模式。书中前面的章节着重讲解了
面向对象的意义、好处以及几个重要的设计原则,后面则是详细讲解了软件的设计模式。
内容归纳
设计模式的原则
设计模式的原则 | |
---|---|
开放封闭原则 | 软件实体(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的 |
单一职责原则 | 每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来 |
里氏代换原则 | 子类可以扩展父类的功能,但不能改变父类原有的功能。 |
依赖倒置原则 | 高层模块不应该依赖低层模块,二者都应该依赖于抽象。 |
接口隔离原则 | 建立单一接口,尽可能地去细化接口,类与类之间应通过接口对接 |
迪米特原则 | 一个对象应当对其他对象有尽可能少的了了解 |
设计模式
创建型模式 | |
---|---|
单例模式 | 某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 |
工厂方法模式 | 定义一个用于创建产品的接口,由子类决定生产什么产品。 |
抽象工厂模式 | 子提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 |
行为型模式 | |
---|---|
模板方法模式 | 定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 |
策略模式 | 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。 |
观察者模式 | 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。 |
命令模式 | 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。 |
中介者模式 | 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。 |
迭代器模式 | 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 |
访问者模式 | 在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。 |
备忘录模式 | 在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。 |
解释器模式 | 提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。 |
心得体会
下面是一个简单的聊天室用户的部分代码
/*用户链表*/ public class UserLinkList { Node root; Node pointer; int count; /*构造用户链表*/ public UserLinkList(){ root = new Node(); root.next = null; pointer = null; count = 0; } /*添加用户*/ public void addUser(Node n){ pointer = root; while(pointer.next != null){ pointer = pointer.next; } pointer.next = n; n.next = null; count++; } /*删除用户*/ public void delUser(Node n){ pointer = root; while(pointer.next != null){ if(pointer.next == n){ pointer.next = n.next; count --; break; } pointer = pointer.next; } } /*返回用户数*/ public int getCount(){ return count; } /*根据用户名查找用户*/ public Node findUser(String username){ if(count == 0) return null; pointer = root; while(pointer.next != null){ pointer = pointer.next; if(pointer.username.equalsIgnoreCase(username)){ return pointer; } } return null; } /*根据索引查找用户*/ public Node findUser(int index){ if(count == 0) { return null; } if(index < 0) { return null; } pointer = root; int i = 0; while(i < index + 1){ if(pointer.next != null){ pointer = pointer.next; } else{ return null; } i++; } return pointer; } }
上面的代码主要是遵守了单一职责原则,之前的项目开发经历比较少,希望以后能够多多使用相应的设计模式加深了解。