命令模式(command line)

本文深入解析了命令模式设计,一种将请求封装为对象的设计模式,适用于需要记录、撤销或重做行为的场景。通过示例代码,展示了如何通过调用者、接受者和命令对象实现行为请求者与行为实现者的解耦。

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

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

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

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

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

命令接口

package DesignPattern.CommandPattern;
public interface Order {
    public void execute();
}

具体命令

package DesignPattern.CommandPattern;

public class SellStock implements Order{

    private Stock abcStock;

    public SellStock(Stock abcStock) {
        this.abcStock = abcStock;
    }

    public void execute() {
        abcStock.sell();
    }

}
package DesignPattern.CommandPattern;

public class BuyStock implements Order{

    private Stock abcStock;

    public BuyStock(Stock abcStock){
        this.abcStock = abcStock;
    }
    public void execute() {
        abcStock.buy();
    }
}

使用命令对象的入口

package DesignPattern.CommandPattern;
import java.util.List;
import java.util.ArrayList;

public class Broker {

    private List<Order> orderList = new ArrayList<>();

    public void takeOrder(Order order){
        orderList.add(order);
    }

    public void placeOrders(){
        for (Order order : orderList) {
            order.execute();
        }
        orderList.clear();
    }
}

命令执行者


package DesignPattern.CommandPattern;

public class Stock {

    private String name = "ABC";
    private int quantity = 10;

    public void buy() {
        System.out.println("Stock [ Name: " + name + ",Quantity: " + quantity + " ] bought");
    }

    public void sell() {
        System.out.println("Stock [ Name: " + name + ", Quantity:" + quantity + " ] sold ");
    }
}

客户端测试程序

package DesignPattern.CommandPattern;

public class Client {

    public static void main(String[] args) {
        Stock abcStock = new Stock();

        BuyStock buyStockOrder = new BuyStock(abcStock);
        SellStock sellStockOrder = new SellStock(abcStock);

        Broker broker = new Broker();
        broker.takeOrder(buyStockOrder);
        broker.takeOrder(sellStockOrder);

        broker.placeOrders();
    }
}

<think>好的,用户现在问的是如何在Vim中进入底线命令模式Command-line Mode)。我需要结合之前的回答和提供的引用内容来准确回答。 首先,回顾之前我的回答,已经详细说明了三种模式,包括底线命令模式,以及如何通过输入冒号进入。现在用户特别想确认进入这个模式的具体方法,可能需要更简洁直接的步骤。 根据用户提供的引用,比如引用[1]提到底线命令模式是第三种模式,用户需要输入冒号进入。引用[2]也指出在命令模式内输入“:”进入底线命令模式。引用[5]同样说明在命令模式按“:”进入,并且执行保存、退出等操作。 用户的需求很明确,所以需要分步骤说明,确保用户不会混淆不同的模式。可能需要强调从命令模式(Normal Mode)进入,因为如果当前在插入模式,必须先按Esc返回命令模式,再输入冒号。 还要注意纠正可能的常见错误,比如用户可能在插入模式下尝试输入冒号,这时候并不会进入底线命令模式,而是直接输入字符。因此,步骤中要强调先退出到命令模式。 此外,引用中提到的一些命令,如:wq和:set nu,可以作为示例,帮助用户理解进入底线模式后的操作。还可以补充一些常用命令,增加实用性。 需要检查是否有其他引用内容相关的信息需要整合,比如引用[3]提到命令模式用于执行保存、退出等,这和底线命令模式的功能一致,可以引用作为说明。 最后,确保回答结构清晰,步骤明确,并附带示例,让用户能够快速理解和应用。同时,相关问题部分可以引导用户进一步学习,比如如何退出或常用命令,提升帮助的全面性。</think>#### 如何在Vim中进入底线命令模式Command-line Mode) --- ### **核心步骤** 1. **确保处于命令模式** - 若当前在输入模式(Insert Mode),按一次$Esc$键返回命令模式(Normal Mode)[^2] - 若在可视模式(Visual Mode),同样按$Esc$返回命令模式 2. **输入冒号触发** -命令模式下,直接按英文冒号$:$,屏幕左下角将显示`:`提示符[^1][^5] - 此时已进入**底线命令模式**,可输入命令并按$Enter$执行 --- ### **操作示例** | 场景 | 操作步骤 | 功能说明 | |--------------------|----------------------------------|--------------------------| | 保存文件 | `:w` → $Enter$ | 写入文件[^1] | | 强制退出不保存 | `:q!` → $Enter$ | 放弃修改退出 | | 显示行号 | `:set nu` → $Enter$ | 激活行号显示[^3] | | 全局替换文本 | `:%s/old/new/g` → $Enter$ | 替换所有匹配内容 | --- ### **常见问题解答** #### Q1:输入冒号后无反应? - 确认未处于输入模式(左下角无`INSERT`字样) - 检查键盘布局是否为英文输入法(中文输入法可能输出全角冒号`:`导致无效) #### Q2:如何退出底线命令模式- 按$Esc$返回命令模式 - 或直接执行命令后自动返回命令模式 --- ### **扩展功能** 1. **组合命令执行** ```vim :wq " 保存并退出 :10,20d " 删除第10-20行 :!ls -l " 临时执行终端命令(按$Enter$返回Vim) ``` 2. **历史命令调用** - 在底线命令模式下,按方向键$↑$/$↓$可浏览历史命令 --- ### **模式切换关系图** ``` 命令模式 (Normal Mode) │ │ 按i/a/o等键 ↓ 输入模式 (Insert Mode) → $Esc$ → 命令模式 │ │ 按:键 ↓ 底线命令模式 (Command-line Mode) ``` --- #### 相关问题 1. 如何在Vim中执行终端命令并查看结果? 2. 如何通过底线命令模式批量注释代码? 3. Vim的`Ex模式`与底线命令模式有何区别? [^1]: 模式切换逻辑参考Vim基础文档 [^2]: 输入模式退出方法详见Linux编辑命令教程 [^3]: 配置命令关联开发环境优化实践 [^5]: 模式状态标识符说明来自Vi/Vim操作手册
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值