Java学习-设计模式-命令模式

61 篇文章 0 订阅
48 篇文章 1 订阅

Java学习-设计模式-命令模式

概述:

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

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

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

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

理解:

简单来说就是把某些操作封装进对象,要执行这个操作的时候,先创建对应的对象,在通过对象里面对应的方法区调用该操作。

假设现在有一个MP3,上面有播放按键和暂停键(为了测试方便,使用简单版mp3,不要其他功能)
1. 首先建一个MP3类 A1 包含播放方法和暂停方法
2. 定义一个命令接口 B,包含一个抽象的执行命令方法(这里也可以建抽象方法)
3. 在创建两个具体的命令实现类 B1、B2 实现这个接口实现类中包含一个类型为MP3类的属性,构造方法初始化这个属性,重写执行命令方法,调用初始化好的属性,执行开始、暂停命令
4. 在创建一个总命令类,包含两个类型为 B 接口的属性,通过set方法初始化这两个属性,在创建两个方法,调用上面两个属性去执行他们类中的方法从而执行某些操作。
5. 测试:创建一个总命令类,set好对应的实现命令类,然后调用总命令类中的方法。

示例:

这里有个问题就是两个实现类都创建了一个MP3类,其实只要一个对象就可以了,所以这里或许可以使用单例模式类来创建这个命令类

package Practices.Mode.Command_Pattern;
// 1. 先建好一个MP3类
public class Mp3 {
    public void start_mode(){
        System.out.println("开启MP3播放功能");
    }
    public void end_mode(){
        System.out.println("开启MP3暂停功能");
    }
}
package Practices.Mode.Command_Pattern;
// 2. 创建一个抽象的命令类
// 描述中应该说的是创建接口,但是我感觉实现类中MP3的属性是公有的,所以这里就创建了一个抽象类
// 但是后面感觉不好,如果不止MP3这一个命令类,那么就必须得写多个抽象类,但是这里只需要执行MP3这一个就好了,就没改
public abstract class Order {
    protected Mp3 mp3 = new Mp3();

    public abstract void comply_Order();
}
package Practices.Mode.Command_Pattern;
// 3. 创建两个命令实现类继承命令抽象类
public class Start_Order extends Order {

    public void comply_Order() {
        mp3.start_mode();
    }
}



package Practices.Mode.Command_Pattern;
// 3. 创建两个命令实现类继承命令抽象类
public class End_Order extends Order {

    public void comply_Order() {
        mp3.end_mode();
    }
}
package Practices.Mode.Command_Pattern;
// 4. 创建一个总命令类
public class All_Order {
    private Order order1;
    private Order order2;

    public All_Order(Order order1, Order order2) {
        this.order1 = order1;
        this.order2 = order2;
    }

    public void mp3_start(){
        order1.comply_Order();
    }

    public void mp3_end(){
        order2.comply_Order();
    }

}
package Practices.Mode.Command_Pattern;
// 5. 测试
public class Test_main {
    public static void main(String[] args) {
        Order startOrder = new Start_Order();
        Order endOrder = new End_Order();

        All_Order order = new All_Order(startOrder, endOrder);

        order.mp3_start();

        order.mp3_end();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值