设计模式学习--策略模式

前言

使用策略模式可以代替多重if-elseswitch语句,让代码维护变得更加简单,乍一看跟工厂模式一模一样,下面是个简单的例子。策略模式包含以下三种角色:

  • 环境(Context)角色:持有一个Strategy的引用
  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现
  • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为

示例

抽象策略角色:定义策略接口

public interface Weather {
    //对应的行为
    void action();
}

具体策略角色:实现策略接口

/**
 * @author jhz
 * @date 18-10-31 下午8:18
 */
public class Sunny implements Weather {
    @Override
    public void action() {
        System.out.println("涂防晒霜!");
    }
}
/**
 * @author jhz
 * @date 18-10-31 下午8:17
 */
public class Rainy implements Weather {
    @Override
    public void action() {
        System.out.println("打伞!");
    }
}
/**
 * @author jhz
 * @date 18-10-31 下午8:19
 */
public class Snowly implements Weather {
    @Override
    public void action() {
        System.out.println("穿雪地鞋!");
    }
}

环境角色:持有策略对象

/**
 * @author jhz
 * @date 18-10-31 下午8:20
 */
public class Action {
    //策略对象
    private Weather weather;

    public Action(Weather weather){
        this.weather = weather;
    }

    public void doAction(){
        weather.action();
    }
}

客户类

/**
 * @author jhz
 * @date 18-10-31 下午8:24
 */
public class Client {
    public static void main(String[] args) {
        Weather sunnyDay = new Sunny();
        new Action(sunnyDay).doAction();
    }
}

小结

看到这儿,相信大家跟我有一样的感觉,这跟简单工厂模式有个啥区别,我们看下策略模式的UML图:

è¿éåå¾çæè¿°

对比一下工厂模式的UML:(盗图)

            C# ç®åå·¥å模å¼

从UML看也差不多,环境类可以充当一个策略工厂,它们真正的不同如下:

1、用途:工厂是创建型模式,策略是行为型模式。(差点把刘伟老师上课教的给忘了,https://blog.csdn.net/LoveLion?viewmode=contents)前者是为了创建对象,后者是为了选择行为。

2、关注点不同,前者关注对象创建,后者关注行为封装。

3、工厂相当于黑盒,策略相当于白盒。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值