乐趣区

关于后端:面试阿里被问到Java设计模式之策略模式我不想多说直接给她整的明明白白

生存中咱们去超市购物能够抉择不同促销价格的商品,去游览能够抉择能够坐汽车、能够坐火车、能够坐飞机。

1,什么是策略模式?

策略模式,就是定义了不同的算法族,并且之间能够相互替换,此模式让算法的变动独立于应用算法的客户。

2,策略模式有什么益处?

策略模式的益处在于你能够动静的扭转对象的行为。

3,设计准则

设计准则是把一个类中常常扭转或者未来可能扭转的局部提取进去,作为一个接口(c++ 中能够用虚类),而后在类中蕴含这个对象的实例,这样类的实例在运行时就能够随便调用实现了这个接口的类的行为。【参考文献】

策略模式属于对象行为型模式,次要针对一组算法,将每一个算法封装到具备独特接口的独立的类中,从而使得它们能够互相替换。策略模式使得算法能够在不影响 到客户端的状况下发生变化。通常,策略模式实用于当一个应用程序须要实现一种特定的服务或者性能,而且该程序有多种实现形式时应用。

策略模式 :定义一系列的算法, 把它们一个个封装起来, 并且使它们可互相替换

策略模式具体角色实现

  • 形象策略(Strategy)类:这是一个形象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略(Concrete Strategy)类:实现了形象策略定义的接口,提供具体的算法实现或行为。
  • 环境(Context)类:持有一个策略类的援用,最终给客户端调用。

1. 创立一个接口

public interface Strategy {void show();
}

2. 创立实现接口的实体类

public class StrategyA  implements Strategy{
    @Override
    public void show() {System.out.println("满 300-40");
    }
}// 退出 Java 开发交换君样:593142328 一起吹水聊天
public class StrategyB implements  Strategy{
    @Override
    public void show() {System.out.println("满 500 打 8 折");
    }
}
public class StrategyC implements  Strategy{
    @Override
    public void show() {System.out.println("买一送一");
    }
}

3. 创立 Context 类

public class Context {
    private Strategy strategy;

    public  Context(Strategy strategy)
    {this.strategy=strategy;}

    public  void  ContextShow()
    {strategy.show();
    }
}
// 退出 Java 开发交换君样:593142328 一起吹水聊天 

应用 Context 来查看当它扭转策略 Strategy 时的行为变动

public static void main(String[] args) {Context context=new Context(new StrategyA());
 context.ContextShow();}

策略模式实现

以淘宝 618 促销为例应用策略模式实现促销打折场景

商品满 300-40,打八折,失常免费

1. 申明免费接口

public interface Cash{double Calculation(double money);
}

2. 申明上下文类

public class Context {
    private Cash cash;

    public  Context(Cash cash)
    {this.cash=cash;}

    public  double  ContextShow(double money)
    {return cash.Calculation(money);
    }
}

3. 申明失常免费子类

public class CashNormal  implements Cash{
    @Override
    public double Calculation(double money) {
        double total=0;
        total=money;
        System.out.println("失常免费, 金额"+total);
        return total;
    }
}

4. 申明打折类

public class CashDiscount implements  Cash{

    private double disCount;
    public  CashDiscount(double disCount)
    {this.disCount=disCount;}

    @Override
    public double Calculation(double money) {
        double total=0;
        total=money*disCount;
        System.out.println("加入打"+disCount+"折流动, 金额"+total);
        return total;
    }
}

5. 申明满减类

public class CashFullreduction implements  Cash{
    // 满减金额
    private  double moneyReturn;
    // 满减门槛
    private  double moneyConditation;

    public  CashFullreduction(double moneyReturn,double moneyConditation)
    {
        this.moneyConditation=moneyConditation;
        this.moneyReturn=moneyReturn;
    }

    @Override
    public double Calculation(double money) {
        double total=0;
        if(money<300){// 如果金额小于 300,不满减
            total=money;// 退出 Java 开发交换君样:593142328 一起吹水聊天
        }
        else
        {total= money-(Math.floor(money/moneyConditation)*moneyReturn);
        }
        System.out.println("领取"+money+"元,满"+moneyConditation+"减"+moneyReturn+", 最初金额为"+total);
        return  total;
    }
}

6. 客户端

public static void main(String[] args) {Context context=new Context(new CashFullreduction(40,300));// 满 300-40
    context.ContextShow(400);
    Context context2=new Context(new CashDiscount(0.8));// 打八折
    context2.ContextShow(400);
    Context context3=new Context(new CashNormal());// 失常免费
    context3.ContextShow(400);
}

总结

1. 长处

  • 策略类之间能够自在切换

    因为策略类都实现同一个接口,所以使它们之间能够自在切换。

  • 易于扩大

    减少一个新的策略只须要增加一个具体的策略类即可,根本不须要扭转原有的代码,合乎“开闭准则“

  • 防止应用多重条件抉择语句(if else),充分体现面向对象设计思维。【白嫖材料】

2. 毛病:

  • 客户端必须晓得所有的策略类,并自行决定应用哪一个策略类。
  • 策略模式将造成产生很多策略类,能够通过应用享元模式在肯定水平上缩小对象的数量。

应用场景:

1、如果在一个零碎外面有许多类,它们之间的区别仅在于它们的行为,那么应用策略模式能够动静地让一个对象在许多行为中抉择一种行为

2、一个零碎须要动静地在几种算法中抉择一种

3、如果一个对象有很多的行为,如果不必失当的模式,这些行为就只好应用多重的条件抉择语句来实现

最初,祝大家早日学有所成,拿到称心 offer,疾速升职加薪,走上人生巅峰。

能够的话请给我一个三连反对一下我哟??????【白嫖材料】

退出移动版