image.png
在一个大数据分析平台中,需要实现一个网络爬虫系统,系统可以调度多个爬虫任务,支持任务的提交、执行、撤销等操作。
肖哥弹架构 跟大家“弹弹” 设计模式,需要代码关注
欢迎 点赞,点赞,点赞。
关注公号Solomon肖哥弹架构获取更多精彩内容
2. 为什么要使用命令设计模式
命令模式将请求封装为一个对象,允许用户使用不同的请求、队列或日志请求来参数化其他对象,并支持可撤销的操作。
3. 标准命令设计模式图
image.png
4. 业务命令设计模式图
image.png
5. 业务代码参考
// 爬虫任务接口
interface CrawlTask {
void crawl();
}
// 具体爬虫任务实现
class ConcreteCrawlTask implements CrawlTask {
private String url;
public ConcreteCrawlTask(String url) {
this.url = url;
}
@Override
public void crawl() {
// 执行爬取逻辑
System.out.println("Crawling URL: " + url);
}
}
// 命令接口
interface Command {
void execute();
}
// 具体命令实现
class ConcreteCrawlCommand implements Command {
private CrawlTask task;
private TaskExecutor executor;
public ConcreteCrawlCommand(CrawlTask task, TaskExecutor executor) {
this.task = task;
this.executor = executor;
}
@Override
public void execute() {
executor.executeTask(task);
}
}
// 任务执行器
class TaskExecutor {
public void executeTask(CrawlTask task) {
task.crawl();
}
}
// 任务管理器
class TaskManager {
private List<Command> tasks = new ArrayList<>();
public void addTask(Command task) {
tasks.add(task);
System.out.println("Task added to queue");
}
public void runTask() {
for (Command task : tasks) {
task.execute();
}
tasks.clear();
}
public void undoTask() {
if (!tasks.isEmpty()) {
Command lastTask = tasks.remove(tasks.size() - 1);
System.out.println("Undoing task: " + lastTask);
// 这里可以添加撤销逻辑,例如回滚数据库操作等
}
}
}
// 客户端使用
class WebCrawlerApplication {
public static void main(String[] args) {
TaskExecutor executor = new TaskExecutor();
TaskManager manager = new TaskManager();
// 创建爬虫任务
CrawlTask task1 = new ConcreteCrawlTask("http://example.com");
CrawlTask task2 = new ConcreteCrawlTask("http://another.com");
// 创建命令并添加到任务管理器
manager.addTask(new ConcreteCrawlCommand(task1, executor));
manager.addTask(new ConcreteCrawlCommand(task2, executor));
// 执行所有任务
manager.runTask();
// 如需撤销最后一个任务
// manager.undoTask();
}
}
6. 使用命令设计模式的好处
- 解耦:爬虫任务的执行与任务提交逻辑解耦。
-
扩展性:新增任务类型时,只需实现
CrawlTask
接口。 - 撤销操作:支持任务的撤销操作。
7. 其他使用命令设计模式场景参考
- 交易系统:订单的提交、回滚等操作。
- 文本编辑器:文本的撤销、重做功能。
8. 可以参考的开源框架
- Java AWT Event Listeners:使用命令模式来实现事件监听。
总结
命令模式通过将操作封装为对象,允许用户对操作进行排队、记录日志和撤销操作,提高了系统的灵活性和可扩展性。
历史热点文章
- 外观模式(Facade Pattern):微服务架构中的数据库访问实战案例分析
- 代理模式(Proxy Pattern):权限校验API调用实战案例分析
- 桥接模式(Bridge Pattern):多样式用户界面组件实战案例分析
- 组合模式(Composite Pattern): 在线教育平台课程管理实战案例分析
- 享元模式(Flyweight Pattern):网页游戏中的角色对象管理实战案例分析
- 观察者模式(Observer Pattern):股票交易系统实战案例分析
- 策略模式(Strategy Pattern):电商平台的优惠券系统实战案例分析
- 模板方法模式(Template Method Pattern):视频播放应用实战案例分析
- 命令模式(Command Pattern):网络爬虫任务队列实战案例分析
- 迭代器模式(Iterator Pattern):电商平台商品分类浏览实战案例分析
- 中介者模式(Mediator Pattern):即时通讯软件实战案例分析
- 备忘录模式(Memento Pattern):游戏存档系统实战案例分析
- 状态模式(State Pattern):电商平台订单状态管理实战案例分析
- 责任链模式(Chain of Responsibility Pattern):电商平台的订单审批流程实战案例分析
- 访问者模式(Visitor Pattern):电商平台商品访问统计实战案例分析
- 工厂方法模式(Factory Method Pattern): 电商多种支付实战案例分析
- 抽象工厂模式(Abstract Factory Pattern):多风格桌面应用实战案例分析
- 建造者模式(Builder Pattern): 在线订单系统实战案例分析
- 原型模式(Prototype Pattern): 云服务环境配置实战案例分析
- 适配器模式(Adapter Pattern):第三方支付集成实战案例分析
- 装饰器模式(Decorator Pattern):电商平台商品价格策略实战案例分析
- 单例模式(Singleton Pattern):购物车实战案例分析