作业二 | 读书笔记----软件设计原则、设计模式

这个作业属于哪个课程 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());
    }
}

个人心得

建造者模式是开发过程中比较常见的一种模式,这种模式易于解耦、易于精确控制对象的创建、易于拓展,并且有很好的封装性,对用户而言比较友好。但也要注意产品必须有共同点,范围有限制。

后台编辑截图

posted @ 2022-03-07 00:28  classviva  阅读(197)  评论(0)    收藏  举报