设计模式学习笔记(五):建造者模式【Builder Pattern】(三)问题引申

本文介绍了一种软件设计模式——建造者模式,通过实例演示如何使用该模式来组织多个方法的调用顺序,实现不同产品的构建过程。以汽车模型为例,展示了如何通过导演类(Director)来灵活地组合启动、停止等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    接着上面的分析。假如有这么个需求,这四个过程(start ,stop ,alarm ,engineBoom)按照排列组合有很多种,那我们怎么满足这种需求呢?也就是要有个类来安排这几种方法组合,就像导演安排演员一样,哪个先出场哪个后出场,哪个不出场。我们叫该类叫做导演类Director。

    增加了Director 类,这个类做了层封装,类中方法说明如下:

A  型号的奔驰车辆模型是只有启动(start)、停止(stop)方法,其他的引擎声音、喇叭都没有;
B  型号的奔驰车是先发动引擎(engine boom),然后启动(star),再然后停车(stop),没有喇叭;
C  型号的宝马车是先喇叭叫一下(alarm),然后(start),再然后是停车(stop),引擎不轰鸣;
D  型号的宝马车就一个启动(start),然后一路跑到黑,永动机,没有停止方法,没有喇叭,没有引擎轰鸣;
E 型号、F 型号…等等,可以有很多,启动(start)、停止(stop)、喇叭(alarm)、引擎轰鸣(engine boom)这四个方法在这个类中可以随意的自由组合,有几种呢?好像是排列组合,这个不会算,高中数学没学好,反正有很多种了,这里都可以实现。

   看下导演类代码实现,Director.java如下:

package com.example;
import java.util.ArrayList;

public class Director {
	private ArrayList<String> sequence = new ArrayList<String>();
	private BenzBuilder benzBuilder = new BenzBuilder();
	private BMWBuilder bmwBuilder =new BMWBuilder();

	public BenzModel getABenzModel(){
		this.sequence.clear();
		sequence.add("start");
		sequence.add("stop");
		benzBuilder.setSequence(sequence);
		return (BenzModel)benzBuilder.getCarModel();
	}
	
	public BenzModel getBBenzModel(){
		this.sequence.clear();
		sequence.add("engineboom");
		sequence.add("start");
		sequence.add("stop");
		benzBuilder.setSequence(sequence);
		return (BenzModel)benzBuilder.getCarModel();
	}
	
	public BMWModel getCBmwModel(){
		this.sequence.clear();
		sequence.add("alarm");
		sequence.add("start");
		sequence.add("stop");
		bmwBuilder.setSequence(sequence);
		return (BMWModel)bmwBuilder.getCarModel();
	}
	
	public BMWModel getDBmwModel(){
		this.sequence.clear();
		sequence.add("start");
		bmwBuilder.setSequence(sequence);
		return (BMWModel)bmwBuilder.getCarModel();
	} 
}

    然后Client 程序就只与Director 类打交道了。假如要生产A类型奔驰车1W辆,B类的奔驰车100W辆,C类的宝马车1000W辆,D类型的我不要:

package com.example;

public class Client {
	public static void main(String[] args) {
		Director director = new Director();
		//1W辆的A类型奔驰车
		for(int i=0; i<10000; i++){
			director.getABenzModel().run();
		}
		//100W辆B类型的奔驰车
		for(int i=0;i<1000000;i++){
		director.getBBenzModel().run();
		}
		//1000W量C类型的宝马车
		for(int i=0;i<10000000;i++){
		director.getCBmwModel().run();
		}
	}
}

     通过这样写完的程序简单明了,自己能看懂,别人也能看懂。

建造者模式总结:

   Client 在具体应用中就是其他的模块或者页面;

   CarModel以及两个实现类 BenzModel 和 BMWModel 叫做产品类(Product Class),这个产品类实现类模板方法模式;

   CarBuilder以及两个实现类 BenzBuilder 和 BMWBuilder 叫做建造者类(Builder Class);

   Director叫做导演类(Director Class),负责安排已有模块的顺序,然后告诉Builder开始建造。
建造者模式与工厂方法模式的区别:

    建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现类;而工厂方法则重点是创建,你要什么对象为创造一个对象出来,组装顺序则不是他关心的。
程序代码:建造者模式【Builder Pattern】(三)

标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成轴加速度计和轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值