设计模式之策略模式

     我们将会创建5个类,Context策略类,CashSuper抽象策略,Zhengchang正常收费类,Dazhe打折收费类。

     Context和CashSuper为聚合关系;CashSuper派生出Zhengchang和Dazhe俩类

     概念性的描述:策略模式是一种定义一系列算法的方法,这些算法都是做相同的事情,只是实现不同(正常出售和打折出售),它做的就是以相同的方式做不同的事情(不管是打折还是正常都是通过收费这个抽象接口调用),减少各种算法和使用算法类之间的耦合关系(这样做从正常收费切换到打折收费只需要改变某种策略就行,不需要大动干戈);

      策略模式的CashSuper类为Context提供一系列可重用的算法或行为,继承有利于有利于析取这些算法中的公共功能。(打折和正常我们都可以通过CashSuper类中的抽象方法获取想要的算法)。

       策略模式就是用来封装算法的,我们几乎可以用它封装任何类型的规则,只要听见需要在不同的情况下处理不同的事情就可以考虑策略模式。(下面会有用户只需要在客户端选择一种方式,我们便可以为它生成想要的结算方式,大大减轻了客户端的压力,完全不需要让客户端知道Zhengchang和Dazhe这俩类,只需要知道Context类,并知道以何种方式使用这个类进行想要的结算便好,同时客户端也没有过多的判断)//偷个懒就不画图了

--看完代码后看下面这段话

        如果不用策略模式我们会不会再客户端创建Abssum类,如果你在客户端创建这个类你就得在客户端添加switch算法,这样才足以让你得到你想要的计算方式。就回到上面说的你的客户端程序员需要知道CashSuper抽象策略,Zhengchang正常收费类,Dazhe打折收费类这三个。如果增加打折方式,客户端程序员还需要在前端大量维护打折的算法,后端也需要大量维护打折算法。如果是策略模式,前端程序员只需要知道Context这一个类。就算增加打折功能,前端程序员只需要在前端添加dazhe字符串,后端根据传来的字符串进行判断,也就是减轻客户端压力,后台增加极少压力。

//客户端
public class Kehuduan{
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        Double i=0.0;
        int ii=5;
        //1调用策略类,并告诉策略类我们的结账为满减结账
        Context cc = new Context("manjian");
        //3通过Context调用计算方法
        i =cc.sum(a,b);
        System.out.println("商品单价:"+a+"商品总数为:"+b+"商品总和为:"+i);
    }
}
//策略类
public class Context {
    Abssum abssum=null;
    //2.策略类发现有人要调用我,并且告诉我满减,那我经过某种算法返回他想要的东西(Manjian)
    //这里要看懂就要了解java的多态,我们将会通过向上转型将所有导出类转型为父类。
    //大概说下其中的机制是java的动态绑定。方法调用的后期绑定,也就是说编译器一直不知道对象的类              //型,但是方法调用机制能找到正确的方法体,并加以调用。
    public Context(String leixing){
        switch (leixing){
            case "manjian":
                this.abssum = new Manjian();break;
            case "zhengchang":
                this.abssum = new Zhengchang();break;
        }
    }
//4有人调用我,我通过动态绑定机制找到了想要的方法并返回正确的数字
    public Double sum(int a,int b){
        return abssum.sum(a,b);
    }
}
//抽象类
public abstract class Abssum {
    public abstract Double sum(int a,int b);
}
//派生类1
public class Zhengchang extends Abssum {
    /*计算总和*/
    @Override
    public Double sum(int a,int b){
        Double sum = Double.valueOf(a*b);
        return sum;
    }
}
//派生类2
public class Manjian extends Abssum {
    @Override
    public Double sum(int a,int b) {
        int j = a+b;
        Double sum = Double.valueOf(a+b);
        if (a+b<3)
            return sum;
        return sum-0.5;
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子鞋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值