zoukankan      html  css  js  c++  java
  • java实现23种设计模式之命令模式

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。

    请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

    主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

    通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

    定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

    package com.ceshi17;
    
    public class Receiver {
        public void action(){
            System.out.println("接受命令!");
        }
    }
    package com.ceshi17;
    
    public interface Command {
        public void exe();
    }
    package com.ceshi17;
    
    public class Invoker {
        private Command command;
        
        public Invoker(Command command) {
            this.command = command;
        }
    
        public void action(){
            command.exe();
        }
    }
    package com.ceshi17;
    
    public class MyCommand implements Command {
    
        private Receiver receiver;
        
        public MyCommand(Receiver receiver) {
            this.receiver = receiver;
        }
        
        @Override
        public void exe() {
            receiver.action();
        }
    
    }
    package com.ceshi17;
    
    public class Test {
    
        public static void main(String[] args) {
            Receiver receiver = new Receiver();
            Command cmd = new MyCommand(receiver);
            Invoker invoker = new Invoker(cmd);
            invoker.action();
        }
    }

    运行结果:

    首先必须要有一个命令的执行对象,该对象的行为是输出接受命令。

    如果你要直接执行receiver.action();就没有然后了。

    为了降低耦合度,需要将该对象的行为由其他对象处理。

    命令类(command)必须要实现接口的执行方法。而执行方法调用的就是receiver.action();

    这个执行要由调用者(invoker)来执行。

    invoker的行为方法(action)就是调用command的exe()方法。

    这样就降低了耦合度。如果需要添加其他命令,只需要实现命令接口就行了。

    主要是将命令的发出者和执行者之间解耦,实现请求和执行分开,

    struts 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。

  • 相关阅读:
    Linux并发与同步专题 (1)原子操作和内存屏障
    Linux并发与同步专题
    功耗案例分析:周期性底电流抬高问题分析和解决
    Android OpenGL 基础入门
    使用Codeblock搭建Windows下Objec-c学习环境
    Muduo 多线程模型对比
    NPTL 线程同步方式
    C++ 封装互斥对象
    Java 常用字符串操作总结
    Android 开发有用代码积累
  • 原文地址:https://www.cnblogs.com/zhengyuanyuan/p/10756622.html
Copyright © 2011-2022 走看看