• 命令模式【Java设计模式】


    前言


    2022/9/25 20:14
    路漫漫其修远兮,吾将上下而求索


    本文是根据袁庭新老师学习所做笔记

    仅供学习交流使用,转载注明出处


    推荐

    袁庭新老师-视频:【Java设计模式】23种Java设计模式,全网最全精讲版本,熬夜爆肝也要学完【10:06:48】

    狂神老师-笔记:设计模式【java提高】

    命令模式

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

    1 介绍

    意图: 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

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

    何时使用: 在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

    如何解决: 通过调用者调用接受者执行命令,顺序:调用者→命令→接受者

    关键代码: 定义三个角色:

    1.received真正的命令执行对象

    2.Command命令

    3.invoker使用命令对象的入口

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

    优点:

    1.降低了系统耦合度。

    2.新的命令可以很容易添加到系统中去。

    缺点: 使用命令模式可能会导致某些系统有过多的具体命令类。

    使用场景: 认为是命令的地方都可以使用命令模式,比如:1.GUI中每一个按钮都是一条命令。2.模拟CMD。

    注意事项: 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。

    命令模式结构示意图:

    2818

    2 实现

    我们首先创建作为命令的接口Order,然后创建作为请求的Stock类。实体命令类BuyStock和SellStock,实现了Order接口,将执行实际的命令处理。创建作为调用对象的类Brofer,_它接受订单并能下订单。

    Broker对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令CommandPatternDemo类使用Broker类来演示命令模式。

    0229

    1.创建一个项目名称为command_pattern的Java项目。

    2.创建一个股票请求类Stock。

    /**
     * 股票类
     */
    public class Stock {
        //股票代码
        private String name;
        //股票数量
        private int quality;
    
        public Stock(String name, int quality) {
            this.name = name;
            this.quality = quality;
        }
        
        public void sell(){
            System.out.println("股票出售:"+name+",股数:"+quality);
        }
        
        public void buy(){
            System.out.println("股票购买:"+name+",股数:"+quality);
        }
        
    }
    
    

    3.创建一个命令接口。

    public interface Order {
        void execute();
    }
    
    

    4.创建实现类

    /**
     * 购买对应的股票
     */
    public class BuyStock implements Order{
        //依赖于Stock对象
        private Stock stock;
    
        //构造方法
        public BuyStock(Stock stock) {
            this.stock = stock;
        }
    
        @Override
        public void execute() {//由此方法完成
            //购买目标股票的业务操作
            stock.buy();
        }
    }
    
    
    /**
     * 股票出售类
     */
    public class SellStock implements Order{
        private Stock stock;
        
        public SellStock(Stock stock) {
            this.stock = stock;
        }
    
        @Override
        public void execute() {
            stock.sell();//完成股票的出售操作
        }
    }
    
    

    5.创建交易员类

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 股票经纪人类
     */
    public class Broker {
        private List<Order> orderLists=new ArrayList<>();
        //1.接受订单
        public void takeOrder(Order order){
            orderLists.add(order);
        }
        
        //2.下订单(购买、出售)
        public void placeOrders(){
            for (Order order:orderLists) {
                order.execute();//执行订单操作(下订单或者出售订单)
            }
        }
    }
    
    

    6.编写客户端

    public class CommandPatternDemo {
        public static void main(String[] args) {
            Stock stock = new Stock("002607", 100);
            BuyStock buyStock = new BuyStock(stock);
            Broker broker=new Broker();
            broker.takeOrder(buyStock);
    
            //执行订单的交易动作
            broker.placeOrders();
    
        }
    }
    
    

    7.结果

    股票购买:002607,股数:100
    

    最后


    2022/9/25 20:45


    p16


    Markdown 2765 字数 218 行数
    HTML 2368 字数 121 段落


  • 相关阅读:
    还未入职,这位将来的博导为学生规划了一条高效学习之路
    Java 异常的捕获及处理 要点 习题
    ChatGPT帮助一名儿童确诊病因,之前17位医生无法确诊
    python基于PHP+MySQL读书分享平台
    卷积神经网络(CNN)网络结构及模型原理介绍
    CF1712 解题报告
    Tomcat 漏洞总结
    day46((VueJS)vuex(全局状态管理对象))
    uni-app之android项目云打包
    面试处处碰壁?不慌,Java 核心面试文档.PDF 助你披荆斩棘
  • 原文地址:https://blog.csdn.net/qq_51625007/article/details/127042304