zoukankan      html  css  js  c++  java
  • 北风设计模式课程---11、策略模式

    北风设计模式课程---11、策略模式

    一、总结

    一句话总结:

    不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例
    策略模式真正的好处:提供算法簇,来应对不同的算法需求,比如有的商品要打折,有的商品满多少减多少,比如有的商品买一送一

    1、策略模式真正的好处?

    提供算法簇,来应对不同的算法需求,比如有的商品要打折,有的商品满多少减多少,比如有的商品买一送一

    2、戒指的不同加成可以通过策略模式实现么(比如 有的戒指加固定攻击,有的戒指 加多少秒回血,有的戒指 加技能)?

    策略模式是行为模式,戒指的这些不同的东西可以考虑通过创建模式中的设计模式来做

    3、策略模式和装饰模式的异同?

    都有被包含的关系:装饰器模式中是实体以及装饰被另外的装饰包含,策略模式是具体策略被context包含

    4、策略模式和工厂模式的异同?

    策略模式:策略封装角色(Context)是根据具体的 具体策略角色 来调用他们的同一个方法
    策略模式的策略封装角色(Context)有点像 简单工厂模式

    5、策略模式中有哪些角色?

    策略抽象角色:比如加密算法抽象类
    具体策略角色:比如具体的MD5机密,MDS加密等
    策略封装角色(Context):包含策略的实例,用户调用这个方法来实现加密,有点类似于工厂角色

    6、策略模式实例:商家满100打八折,满200返100怎么实现?

    策略抽象角色:优惠抽象类,有一个"返利"的方法,需要传一个参数(用户消费的金额)
    具体策略角色:优惠类A(满100打八折),优惠类B(满200返100)
    策略封装角色(Context):根据传入的具体策略角色,来调用它的"返利"方法

    7、策略模式优点?

    1、管理相关的算法族
    2、替换继承关系
    3、避免使用多重条件转移语句
    1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定
    义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类
    里面,从而避免重复的代码。
    2. 策略模式提供了可以替换继承关系的办法。继承可以处理多种算
    法或行为。如果不是用策略模式,那么使用算法或行为的环境类就
    可能会有一些子类,每一个子类提供一个不同的算法或行为。但
    是,这样一来算法或行为的使用者就和算法或行为本身混在一起。
    决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻
    辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或
    行为变得不可能。
    3. 使用策略模式可以避免使用多重条件转移语句。多重转移语句不
    易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行
    为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办
    法还要原始和落后。

    8、策略模式legend2中的实例?

    抽奖一次花多少钱,10连抽花多少钱

    9、策略模式缺点?

    1、客户端必须知道所有的策略类
    2、策略模式造成很多的策略类
    1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
    
    2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

    二、内容在总结中

    1、相关知识

    2、代码

    1、抽象策略角色:Strategy.java

    2、策略具体角色1:StrategyA.java

    3、策略具体角色2:StrategyB.java

    4、策略封装角色:Context.java

    5、客户端调用: MainClass.java

    1、抽象策略角色:Strategy.java

    package com.ibeifeng.strategy;
    
    public interface Strategy {
    
        public double cost(double num);
    }

    2、策略具体角色1:StrategyA.java

    package com.ibeifeng.strategy;
    
    public class StrategyA implements Strategy{
    
        public double cost(double num) {
            return num * 0.8;
        }
    
    }

    3、策略具体角色2:StrategyB.java

    package com.ibeifeng.strategy;
    
    public class StrategyB implements Strategy {
    
        public double cost(double num) {
            if(num >= 200) {
                return num - 50;
            }
            return num;
        }
    
    }

    4、策略封装角色:Context.java

    package com.ibeifeng.strategy;
    
    public class Context {
        private Strategy strategy;
        
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
        
        public double cost(double num){
            return this.strategy.cost(num);
        }
        
    }

    5、客户端调用: MainClass.java

    package com.ibeifeng.strategy;
    
    public class MainClass {
        public static void main(String[] args) {
            double num = 200;
            Context context = new Context(new StrategyB());
            double newNum = context.cost(num);
            System.out.println("ʵ݊ض֋" + newNum + "Ԫ");
        }
    }
     
  • 相关阅读:
    LeetCode 40. 组合总和 II(Combination Sum II)
    LeetCode 129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
    LeetCode 60. 第k个排列(Permutation Sequence)
    LeetCode 47. 全排列 II(Permutations II)
    LeetCode 46. 全排列(Permutations)
    LeetCode 93. 复原IP地址(Restore IP Addresses)
    LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
    LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
    一重指针和二重指针
    指针的意义
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11027528.html
Copyright © 2011-2022 走看看