15-邮局:命令模式

15.1 邮局寄信

  本章我们以通过邮局寄信的例子来学习命令模式。

15.2 模式定义

  命令模式(Command Pattern),将来自客户端的请求封装成一个对象,无须了解这个请求激活的动作或者有关接受这个请求的处理细节。命令模式的根本目的在于将“请求者”与“实现者”之间解耦。其实命令模式与很多其它设计模式一样,就是在请求者和实现者之间增加一个中间人的角色,来达到解除耦合的目的。通过对中间角色的特殊设置,从而形成不同的设计模式,命令模式也不例外。

15.3 模式实现

15.3.1 创建消息接收者接口——IReceiver

package com.demo.receiver;

/**
 * Created by lsq on 2018/3/27.
 * 信件接收者接口
 */
public interface IReceiver {
    /**
     * 收件人收到信件读取
     * @param message
     */
    public void readMail(String message);
}

15.3.2 创建消息接收者类——Receiver

package com.demo.receiver;

/**
 * Created by lsq on 2018/3/27.
 * 信件接收者
 */
public class Receiver implements IReceiver{
    /**
     * 收件人读取信件
     * @param message
     */
    public void readMail(String message){
        System.out.println("收件人读取信件:"+message);
    }
}

15.3.3 创建中间角色邮局

1. 邮局接口——IPost

package com.demo.command;

/**
 * Created by lsq on 2018/3/27.
 * 邮局接口
 */
public interface IPost {
    /**
     * 邮局发送信件
     * @param message
     */
    public void sendMail(String message);
}

2. 邮局实现——Post

package com.demo.command;

import com.demo.receiver.IReceiver;

/**
 * Created by lsq on 2018/3/27.
 * 邮局实现类
 */
public class Post implements IPost{
    //收信人对象实例
    private final IReceiver receiver;

    /**
     * 构造方法传入收信人对象实例
     * @param receiver
     */
    public Post(IReceiver receiver){
        this.receiver = receiver;
    }

    /**
     * 邮局发送信件
     * @param message
     */
    @Override
    public void sendMail(String message) {
        System.out.println("邮局将信件发送给收信人……");
        //邮局发送信件给收信人
        this.receiver.readMail(message);
    }
}

15.3.4 创建消息发送者

package com.demo.invoker;

import com.demo.command.IPost;

/**
 * Created by lsq on 2018/3/27.
 * 发件人
 */
public class Invoker {
    //邮局作为私有属性
    private IPost post;

    /**
     * 通过set方法设置邮局对象实例
     * @param post
     */
    public void setPost(IPost post){
        this.post = post;
    }

    public void postMail(String message){
        System.out.println("发件人投递信件给邮局……");
        this.post.sendMail(message);
    }
}

15.3.5 客户端程序

package com.demo;

import com.demo.command.IPost;
import com.demo.command.Post;
import com.demo.invoker.Invoker;
import com.demo.receiver.IReceiver;
import com.demo.receiver.Receiver;

/**
 * Created by lsq on 2018/3/27.
 * 应用程序
 */
public class Client {
    public static void main(String[] args) {
        //创建一个收件人对象实例
        IReceiver receiver = new Receiver();
        //创建一个邮局对象实例,传入收件人对象实例
        IPost post = new Post(receiver);
        //创建一个发件人对象实例,传入邮局对象实例
        Invoker invoker = new Invoker();
        invoker.setPost(post);
        //发件人开始发送信息
        invoker.postMail("你好!好久不见,最近还好吗?");
    }
}

运行结果:

15.4 使用场合

  1)抽象出待执行的动作以参数化某对象。类似于过程设计中的回调机制,而命令模式正是回调机制的一个面向对象的替代品。

  2)在不同的时刻指定、排列和执行请求。

  3)需要支持可撤销的操作。

  4)需要支持修改日志功能。这样当系统崩溃时,这些修改可以被重新做一遍。

  5)需要支持事务系统。

原文地址:https://www.cnblogs.com/danielleee/p/8660946.html

时间: 2024-08-30 06:26:08

15-邮局:命令模式的相关文章

设计模式之命令模式---Command Pattern

模式的定义 命令模式是一个高内聚的模式,定义如下: Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录日志,可以提供命令的撤销和恢复功能. 模式的使用场景 只要

【c++设计模式】命令模式

行为型模式 15)命令模式 本文主要参考: https://www.jianshu.com/p/0ae8582ff831 命令模式做为一种行为模式,本质也是一种请求-响应模式.将命令的调用和命令的执行分开. 在一些软件系统中,行为的请求和实现往往是强耦合的,但是这样就无法处理命令的记录.撤销.重做等操作.例如word中的撤销操作,几乎所有的命令都能够被撤销. 通过将命令的调用和请求分别抽象成为一组操作,就可以实现两者的弱耦合. 命令模式主要包括三个角色: 命令,一般是抽象类,定义各种不同的命令操

15.设计模式_命令模式

一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否"优美".可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完成设计模式这个系列,希望通过这种总结的方式来加深自己设计模式的理

(15):(行为型模式) Command 命令模式

(15):(行为型模式) Command 命令模式

命令模式——邮局发信

一模式定义 命令模式,将来自客户端的请求封建为一个对象,无须了解这个请求激活的动作或有关接受这个请求的处理细节.命令模式的根本目的在于将"请求者"与"实现者"之间解耦. 二模式举例 1模式分析 我们借用邮局发信来说明这一模式. 2命令模式静态类图 3代码示例 3.1信件接收者接口一IReceiver下载 Java代码   package com.demo.receiver; /** * 信件接收者接口 * * @author * */ public interfac

15 行为型模式-----命令模式

模式动机(Command Pattern):将请求封装为对象,从而可以用不同的请求对客户进行参数化:对请求进行排队或记录请求日志:设计可撤销的结构等,这些都是命令模式发挥作用的环境.核心思想是:定义一个抽象的Command接口以执行命令.具体如何执行需要其子类ConcreteCommand来实现.ConcreteCommand在执行命令时必须借助于合适的接受该命令的对象,因此其维护一个Receiver指针.这样就能将命令调用者Invoker和命令的实际接收者Receiver进行解耦,调用者针对抽

C#设计模式(15)——命令模式(Command Pattern)

原文:C#设计模式(15)--命令模式(Command Pattern) 一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否“优美”.可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完

【行为型模式】《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式

命令模式:将一个请求封装为一个对象,从而使得你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作[DP] 先看代码吧: Receiver: package com.sjmx.command; public class Receiver { public void doSomething(){ System.out.println("接受者-业务逻辑处理"); } } Command: package com.sjmx.command; public abst

JAVA设计模式(15):行为型-命令模式(Command)

介绍 命令模式:将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.也称之为:动作Action模式.事务transaction模式. 结构 Command抽象命令类 定义命令的接口,声明执行的方法. ConcreteCommand具体命令类 命令接口实现对象,是"虚"的实现:通常会持有接收者,并调用接收者的功能来完成命令要执行的操作. Invoker调用者/请求者 请求的发送者,它通过命令对象来执行请求.一个调用者并不需