java-行为型模式-策略设计模式

java-行为型模式-策略设计模式

策略模式概述

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

为什么叫策略设计模式?

见名知意,这是在做开发时的一种规范,那我们的所有设计模式当然也遵循了这种规范。OK。策略是什么?即是解决某种问题的一种计划或者方案。

实例

需求:一家商店会有多种促销手段来进行价格上的优惠,从而得到不同的最终价格,我们使用策略模式来进行多种价格算法上的优惠。

代码整体结构如下
这里写图片描述

创建一个优惠方式的抽象类

package com.beyondli.strategy.commodity;

/**
 * Created by beyondLi on 2017/6/2.
 */
public interface Discount {
    /**
     *
     * @param price 传入价格
     * @return      返回折扣后的价格
     */
    Double getDiscountPrice(Double price);
}

创建两个具体优惠方案
方案A(打八折)

package com.beyondli.strategy.commodity.impl;

import com.beyondli.strategy.commodity.Discount;

/**
 * Created by beyondLi on 2017/6/2.
 * 折扣方案A(打八折)
 */
public class DiscountSchemeA implements Discount {
    @Override
    public Double getDiscountPrice(Double price) {
        return price * 0.8;
    }
}

方案B(满100-20)

package com.beyondli.strategy.commodity.impl;

import com.beyondli.strategy.commodity.Discount;

/**
 * Created by beyondLi on 2017/6/2.
 * 折扣方案B(满100减20)
 */
public class DiscountSchemeB implements Discount {
    @Override
    public Double getDiscountPrice(Double price) {
        if (price >= 100) {
            return price - 20;
        } else {
            return price;
        }
    }
}

创建properties配置文件(读取使用的优惠方案)
这里写图片描述
创建客户端(调用优惠方法)

package com.beyondli.strategy;

import com.beyondli.strategy.commodity.Discount;

import java.util.Properties;

/**
 * Created by beyondLi on 2017/6/2.
 */
public class Client {
    public static void main(String[] args) throws Exception {
        //模拟传入的价格为200元
        Double price = 200d;
        //要选择的折扣方案(从properties配置文件中获取)
        //不了解properties的也可以直接将way写死
        Properties p = new Properties();
        p.load(Client.class.getClassLoader().getResourceAsStream("discount.properties"));
        //获取到方案名称
        //或写死 例:String way = "DiscountSchemeA"
        String way = (String) p.get("discount");
        //拼接对应方案的路径获取字节码
        String wayPath = "com.beyondli.strategy.commodity.impl." + way;
        //通过反射创建对应的字节码文件
        Discount discountWay = (Discount) Class.forName(wayPath).newInstance();
        //调用具体的折扣方案
        //使用折扣方案
        Double discountPrice = discountWay.getDiscountPrice(price);
        System.out.println("使用了" + way + "方案,折扣后的价格为:" + discountPrice);

    }
}

通过以上代码即可根据properties配置文件中的不同方案名调用不同的具体优惠方法,当我需要添加新的优惠方案时,只需将实现了Discount抽象类的子类添加进去即可,不需要对其他任何代码进行变动。

总结

有些同学会对策略设计模式与工厂设计模式傻傻分不清,个人感觉,这两种设计模式一般是可以结合使用的,只是侧重点不同。工厂侧重的是创建对象,而策略侧重的是你具体的解决方案(例如上例中的Discount、DiscountSchemeA、DiscountSchemeB),对于策略模式而言,这三个文件才是其核心,而client以及properties个人感觉谈不上是策略模式的核心,只是为了体现出开闭原则的效果以及整体所期望的效果而添加,其实此demo可以说是策略模式的demo,也可以说是类似于工厂设计模式的demo。以上均为个人理解,如有不足或者错误,望指出,共同成长。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值