作业二 | 读书笔记----软件设计原则、设计模式
| 这个作业属于哪个课程 | 2022软件代码开发技术 |
|---|---|
| 这个作业要求在哪里 | 读书笔记----软件设计原则、设计模式 |
| 这个作业的目标 | 1.学习软件设计模式的分类和各种模式的基本内容 |
| 2.了解软件设计原则 |
阅读书籍
郑阿奇《软件秘笈:设计模式那点事》
设计模式分类

设计模式原则

- “开闭”原则
- 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化。
- 单一职责原则
- 一个方法,一个类只负责一个职责,各个职责的程序改动,不影响其它程序。
- 依赖倒置原则
- 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象,抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
- 接口隔离原则
- 类和类之间应该建立在最小的接口上。
- 里氏替换原则
- 使用的基类可以在任何地方使用继承的子类,完美的替换基类。
- 迪米特法则
- 一个类尽量减少自己对其他对象的依赖,原则是低耦合,高内聚,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。
建造者模式
在以往更常使用的是建造者模式。
建造者模式:建造者模式是将复杂的对象构造进行分离,使得每个部件完成比较独立的工作。通过抽象类,接口来约束建造的过程。
解决问题
- 当生成的产品对象内部具有复杂的结构。
- 当复杂对象需要与表示分离,可能需要创建不同的表示时。
- 当需要向客户隐藏产品内部结构表现时。
优缺点
- 优点:良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节;建造者独立,容易扩展。
- 缺点:会产生多余的Builder对象以及Director对象,消耗内存。
UML

代码结构

关键成分
- 建造者(builder):创建和提供实例。
- 指导者(director):管理建造出来的实例的依赖关系。
商品的实体
package com.demo.builder.model;
/**
* 产品实体
*/
public class MobilePackage {
private float money;
private int shortInfo;
private String music;
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
public int getShortInfo() {
return shortInfo;
}
public void setShortInfo(int shortInfo) {
this.shortInfo = shortInfo;
}
public String getMusic() {
return music;
}
public void setMusic(String music) {
this.music = music;
}
}
建造者的抽象类
package com.demo.builder.base;
import com.demo.builder.model.MobilePackage;
/**
* 建造者抽象类
*/
public abstract class AbstractBasePackage {
protected MobilePackage mobilePackage;
public AbstractBasePackage() {
this.mobilePackage = new MobilePackage();
}
}
抽象建造者的行为
package com.demo.builder.itf;
import com.demo.builder.model.MobilePackage;
/**
* 抽象建造者行为
*/
public interface IMobileBuilder {
void buildMoney();
void buildShortInfo();
void buildMusic();
MobilePackage getMobilePackage();
}
建造者实体
package com.demo.builder.itf;
import com.demo.builder.base.AbstractBasePackage;
import com.demo.builder.model.MobilePackage;
/**
* 建造者实体
*/
public class MobileBuilderImpl1 extends AbstractBasePackage implements IMobileBuilder{
@Override
public void buildMoney() {
this.mobilePackage.setMoney(20.0f);
}
@Override
public void buildShortInfo() {
this.mobilePackage.setShortInfo(400);
}
@Override
public void buildMusic() {
this.mobilePackage.setMusic("歌曲1");
}
@Override
public MobilePackage getMobilePackage() {
return this.mobilePackage;
}
}
指导者
package com.demo.builder.director;
import com.demo.builder.itf.IMobileBuilder;
import com.demo.builder.model.MobilePackage;
/**
* 建造指导者
*/
public class MobileDirector {
public MobilePackage createMobilePackage(IMobileBuilder mobileBuilder) {
if (mobileBuilder != null) {
mobileBuilder.buildMoney();
mobileBuilder.buildMusic();
mobileBuilder.buildShortInfo();
return mobileBuilder.getMobilePackage();
}
return null;
}
}
实现方法
package main;
import com.demo.builder.director.MobileDirector;
import com.demo.builder.itf.MobileBuilderImpl1;
import com.demo.builder.itf.MobileBuilderImpl2;
import com.demo.builder.model.MobilePackage;
/**
* Created by Administrator on 2016/8/8.
*/
public class MainApp {
public static void main(String[] args) {
MobileDirector mobileDirector = new MobileDirector();
MobileBuilderImpl1 mobileBuilderImpl1 = new MobileBuilderImpl1();
MobileBuilderImpl2 mobileBuilderImpl2 = new MobileBuilderImpl2();
printMessage(mobileDirector.createMobilePackage(mobileBuilderImpl1));
printMessage(mobileDirector.createMobilePackage(mobileBuilderImpl2));
}
public static void printMessage(MobilePackage mobilePackage) {
System.out.println("--话费: " + mobilePackage.getMoney() + "\t短信: " + mobilePackage.getShortInfo() + "\t彩铃: " + mobilePackage.getMusic());
}
}
个人心得
建造者模式是开发过程中比较常见的一种模式,这种模式易于解耦、易于精确控制对象的创建、易于拓展,并且有很好的封装性,对用户而言比较友好。但也要注意产品必须有共同点,范围有限制。
后台编辑截图

浙公网安备 33010602011771号