Java设计模式 ---- 策略模式

一,策略模式

    策略模式定义了一套算法族, 对每一种算法进行封装, 并提供一个顶层的接口或者抽象类满足算法间的互换

二,UML类图


    1,Strategy : 策略模式算法族的顶层接口,定义了行为方法;

    2,ConcreteStrategy : 具体策略算法,实现Strategy接口,重写策略方法,确定某一具体行为

    3,Context : 环境类,使用算法的角色,在解决问题时可能采用不同的策略,持有Strategy的引用并进行算法应用

三,代码分析 --- 以快递为例

    1,快递接口

public interface Express {

    public void send();
}

    接口中提供了一个发快递的方法

    2,快递具体实现

public class DFExpress implements Express {

    @Override
    public void send() {
        System.out.println("东风速递, 全球必达");
    }
}

public class JDExpress implements Express{

    @Override
    public void send() {
        System.out.println("京东进行派送");
    }
}

public class SFExpress implements Express {

    @Override
    public void send() {
        System.out.println("顺丰进行派送");
    }
}

public class YDExpress implements Express {

    @Override
    public void send() {
        System.out.println("默认韵达快递...");
    }
}

    统一实现了快递(Express)接口,并重写了send()方法,分别定义不同的发送方式

    3,环境类

public class SendPackage {

    public void sendPackage(String status) {
        Express express = ExpressFactory.newInstance(status);
        express.send();
    }
}

    客户端传递制定的算法编码到环境类中, 环境类传递该状态并通过简单工厂模式实例化对象

    4,工厂类

public class ExpressFactory {

    public static Express newInstance(String status) {
        if (ExpressEnum.SF_EXPRESS.getStrValue().equals(status)) {
            return new SFExpress();
        } else if (ExpressEnum.JD_EXPRESS.getStrValue().equals(status)) {
            return new JDExpress();
        } else if (ExpressEnum.DF_EXPRESS.getStrValue().equals(status)) {
            return new DFExpress();
        }
        return new YDExpress();
    }
}

    工厂类中,接收环境类传递的状态,并使用枚举进行比对并创建对象

    5,枚举类

public enum ExpressEnum {
    SF_EXPRESS("1"), JD_EXPRESS("2"), DF_EXPRESS("3"), YD_EXPRESS("4");

    private String value;

    private ExpressEnum(String value) {
        this.value = value;
    }

    public Integer getValue() {
        return Integer.valueOf(value);
    }

    public String getStrValue() {
        return value;
    }
}

    6,测试类

public class ExpressTest {
    public static void main(String[] args) {
        // 创建包裹
        SendPackage sendPackage = new SendPackage();
        // 发送包裹
        sendPackage.sendPackage(ExpressEnum.DF_EXPRESS.getStrValue());
    }
}

    7,测试结果


    最终运行结果

    8,设计考虑

        * 引用工厂类 : 正式开发环境中,前后台交互类似于这样的场景传递基本会以CODE形式为主,后台需要对该CODE进行解析,这就需要添加分支判断;

        * 引用枚举类 : 对CODE应该提供一个标准的类进行约束,不能依靠习惯默认,项目成长起来后,基础的东西往往会造成意想不到的后果;

四,利弊分析

    * 很明显,策略模式提供了一套可扩展的算法族,用户可以自定义行为调用对应的算法进行处理,增强了代码的灵活性和可扩展性

    * 在类结构中,每一种算法的添加,都需要定义对应的类。这在大型项目中很容易造成类结构过于臃肿!

五,个人理解 --> 工厂模式和策略模式

    * 工厂模式提供了一个对象

    * 策略模式提供了一个功能接口

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值