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。

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/zhengyuanyuan/p/10756622.html
Copyright © 2011-2022 走看看