设计模式之命令模式

来源:互联网 发布:2016网络播放器软件 编辑:程序博客网 时间:2024/06/04 18:10

模式定义:
        将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。
        用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。
        分离变化与不变的因素。
遵循原则:
        开闭原则;
        最少知识原则;
适用场合:
        (1)使用命令模式作为"CallBack"在面向对象系统中的替代。"CallBack"讲的便是先将
        一个函数登记上,然后在以后调用此函数。

        (2)需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有
        不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。
        这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之
        后传送到另外一台机器上去。

        (3)系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销
        命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以
        提供redo()方法,以供客户端在需要时,再重新实施命令效果。

        (4)如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里
        读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩
        溃前所做的数据更新。
知识扩展:
        JDK中ActionListener就是命令模式。


public class Receiver {
    public void readMail(String message){
        System.out.println("接收到消息:" + message);
    }
}

public interface IPost {

    public void postMail(String message);

}

public class Post implements IPost{

    private Receiver receiver;

    public Post(Receiver receiver) {
        this.receiver = receiver;
    }

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

}

public class Sender {
    private IPost post;

    public void setPost(IPost post) {
        this.post = post;
    }
    public void sendMail(String message){
        System.out.println("发信人寄信给收信人");
        this.post.postMail(message);
    }
}


测试

public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        IPost post = new Post(receiver);
        Sender sender = new Sender();
        sender.setPost(post);
        sender.sendMail("你最近好嘛?我想你了");
    }
}

0 0
原创粉丝点击