走进设计模式的世界6:老婆让你干的事赶紧的-命令模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35165632/article/details/83820371

命令模式:

将请求封装成对象,这可以让你使用不同的请求、队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。

解释:随着科技的发展,变化的速度和扩展的速度也逐渐增强。单一的耦合的设计往往不符合时代的趋势。就拿智能家电的例子来说一个遥控器的几个按钮分别控制着不同的家用电器。如果没有一个好的设计模式的话,代码的可复用性就非常差。类的种类繁多,每个家电的开关的逻辑又不一样。如果我们不引用命令模式无论是扩展还是二次开发都会产生很大的工作量。所谓命令模式,就是让发起者和执行者之间解耦,发起者不用关心执行者是如何执行的只是让他执行就可以了。

命令模式样例演示:老婆让你干的事你赶紧的。

/**
    万恶的双11就要来了
    老婆的购物车东西多的让你头皮发麻
    遥想当年的app,只有一个淘宝让你老婆购买
    真的美好
**/

// 老婆控制器
public WifeControl{
    // 淘宝的购买类
    private BuyTaoBao buyTaoBao;
    // 构造器
    public WifeControl(BuyTaoBao buyTaoBao){
        this.buyTaoBao = buyTaoBao;
    }

    // 双11的信息
    public doubleEleven(){
        // 选择商品
        buyTaoBao.choose();
        // 下订单
        buyTaoBao.order();
        // 用支付宝支付
        buyTaoBao.payByZhiFuBao();
    }
}

// 淘宝购买的类
public class BuyTaoBao{
    
    // 选择商品
    public void choose(){
        ...
    }
    // 下订单
    public void order(){
        ...
    }
    // 用支付宝支付
    public void payByZhiFuBao{
        ...
    }
}

// 测试类
public class Test{
    public static void mian(String[]args){
        // 获取淘宝的实体类
        BuyTaoBao taobao = new BuyTaoBao();
        // 获取wife控制器
        WifeControl wife = new WifeControl(taobao);
        // 清空淘宝购物车
        wife.doubleEleven();
    }
}

上面的例子诠释了如果只清空淘宝购物车的功能,现在的购物app越来越多。唯品会。。京东。。淘宝。。

如果媳妇都让你清空呢?你总不能给WifeControl 加各种参数吧。

那么就引入了如下设计模式 命令模式

/**
    先看一个简化版的吧。
    让我们一个个去清空媳妇的购物车。    
**/

/**
    首先创建一个接口
    让所有的购物app的流程都实现统一的接口
**/

public interface DoubleElevenBuy{
    // 规定统一的方法双11
    public void doubleEleven();
}

/**
    然后让所有的购物app类都去实现这个接口
**/
// 淘宝
public class TaoBaoApp implements DoubleElevenBuy{
    // 双11购买的方法
    public void doubleEleven(){
        // 选择商品
        this.choose();
        // 下订单
        this.order();
        // 用支付宝支付
        this.payByZhiFuBao();
    }
}

// 京东
public class JingDongApp implements DoubleElevenBuy{
    // 双11购买的方法
    public void doubleEleven(){
        // 选择商品
        this.choose();
        // 下订单
        this.order();
        // 用微信支付
        this.payByWeiXin();
    }
}

// 唯品会
public class WeiPinHuiApp implements DoubleElevenBuy{
     // 双11购买的方法
    public void doubleEleven(){
        // 选择商品
        this.choose();
        // 下订单
        this.order();
        // 确认海外直购信息(怎么感觉我在给唯品会做广告)
        this.buyOrNot();
        // 用银行卡支付
        this.payByBank();
    }
}

/**
    下面就是老婆控制器的代码了
    注意观察于上一代代码有何不同
**/
public class WifeControl{
    // 命令对象
    private DoubleElevenBuy doubleElevenBuy;
    // 构造方法
    public WifeControl(DoubleElevenBuy doubleElevenBuy){
           this.doubleElevenBuy = doubleElevenBuy;
    }
    private doubleEleven(){
        // 清空购物车
        doubleElevenBuy.doubleEleven();
    }
}

public class Test{
    public static void main(String[]args){
        // 淘宝
        DoubleElevenBuy  taobao = new TaoBaoApp();
        // 京东
        DoubleElevenBuy  jingdong = new JingDongApp();
        // 唯品会
        DoubleElevenBuy  weipinhui = new WeiPinHui();
        // 先命令我清空淘宝
        WifeControl wife = new WifeControl(taobao);
        // 我照做了
        wife.doubleEleven();
        // 京东
        wife = new WifeControl(jingdong);
        // 我照做了
        wife.doubleEleven();
        // 唯品会
        wife = new WifeControl(weipinhui);
        // 我照做了
        wife.doubleEleven();
    }
}

以上设计让老婆控制器不在关心我是如何从各个app给她清空购物车的了,完成了命令者与被命令者的解耦,只要知道每个app都有个清空购物车的功能就可以了。既然每个app都有清空购物车功能当然也有退费功能了。。所以自己想怎么扩展。

如果老婆想只跟我说一次就把所有她手机里的购物app清空购物车呢???我们做如下修改。

/**

    懒得不行了的老婆控制类
**/
public class WifeControl{
    DoubleElevenBuy[] doubleElevenBuys;
    public WifeControl(DoubleElevenBuy[] doubleElevenBuys){
        this.doubleElevenBuys = doubleElevenBuys;
    }
    
    public void doubleElevenBuy(){
        for(DoubleElevenBuy doubleElevenBuy:doubleElevenBuys){
            doubleElevenBuy.doubleElevenBuy();
        }
    }
}

public class Test{
    public static void main(String[]args){
         DoubleElevenBuy[] doubleElevenBuys = new   DoubleElevenBuy[4];
         doubleElevenBuys.add(new TaoBaoApp());
         doubleElevenBuys.add(new JingDongApp());
         doubleElevenBuys.add(new WeiPinHuiApp());
         doubleElevenBuys.doubleElevenBuy();
    }
}

总结:设计的时候要考虑减少耦合,尽量做到松耦合不要有太多的OO类型设计。

猜你喜欢

转载自blog.csdn.net/qq_35165632/article/details/83820371