策略模式

定义

它定义了算法家族,分别封装起来,让他们之间可以互相交换,此模式让算法的变化,不会影响到使用算法的用户
找出变化点,封装变化点是我们面向对象的一种重要的思维方式

应用场景

1.针对同一类型问题的多种处理方式,仅仅是具体行为有差别时; 
2.需要安全地封装多种同一类型的操作时; 
3.出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。
4.需要在不同时间应用不同的的业务规则

实例

1模板:
Strategy类,定义所有支持的算法的公共接口

//抽象算法类
public interface Strategy {
    //算法方法
    public abstract void algorithmInterface();
}

ConcreteStrategy封装具体的算法或行为,继承于Strategy

public class ConcreteStrategyC implements Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("===========算法C=============");
    }
}
================================================================================
public class ConcreteStrategyB implements Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("===========算法B=============");
    }
}
==================================================================================
public class ConcreteStrategyA implements Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("===========算法A=============");
    }
}

Context

//上下文
public class Context {
    Strategy strategy;

    //初始化是传入的具体的策略对象
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    //上下文接口
    public void ContextInterface(){
        strategy.algorithmInterface();
    }
}

客户端

//客户端
public class Main {
    public static void mian(String args[]){
        Context context;
        context = new Context(new ConcreteStrategyA());//实例化不同的对象
        context.ContextInterface();
    }
}

2.商场不同优惠方式:1.正常收费 2.满300返100 3.打8折

//优惠方式接口类
public interface CashSuper {
    public abstract double acceptCash(double money);
}

优惠实现

//正常收费
public class NormalCash implements CashSuper {
    @Override
    public double acceptCash(double money) {
        return money;
    }
}
===================================================================================
//打8折收费
public class DiscountCash implements CashSuper {

    private double discount;//折扣

    public DiscountCash(double discount) {//初始化时加上折扣
        this.discount = discount;
    }

    @Override
    public double acceptCash(double money) {
        return money*discount;
    }
}
======================================================================================
//返利
public class ReturnCash implements CashSuper {
    private double returnCondition ;//返利条件
    private double returnMoney;//返利金额

    public ReturnCash(double returnCondition, double returnMoney) {
        this.returnCondition = returnCondition;
        this.returnMoney = returnMoney;
    }

    @Override
    public double acceptCash(double money) {
        double result=money;
        if(money>returnCondition){
            money=money-Math.floor(money/returnCondition)*returnMoney;
        }
        return money;
    }
}

context实现优惠方式

import strategy.CashSuper;
import strategy.DiscountCash;
import strategy.NormalCash;
import strategy.ReturnCash;

public class CashContext {
    CashSuper cashSuper;
//策略模式与工厂模式结合
    public CashContext(String type) {
        switch (type)
        {
            //正常收费
            case "1":cashSuper=new NormalCash();break;
            //打8折
            case "2":cashSuper=new DiscountCash(0.8);break;
            //满300减100
            case "3":cashSuper=new ReturnCash(300,100);
        }

    }

    public double GetResult(double money){
        return cashSuper.acceptCash(money);
    }
}

客户端

import java.util.Scanner;

public class Main {
    public static void main(String args[]){
         double total=0;
         System.out.println("输入对应收费方式前的数字:\n1.正常收费\n2.打8折\n3.满300减100");
        Scanner sc = new Scanner(System.in);
        String type = sc.nextLine();
         CashContext cashContext = new CashContext(type);
         System.out.println("输入收费金额:");
         double money = sc.nextInt();
         total = cashContext.GetResult(money);
         System.out.println(total);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值