美文网首页
策略模式

策略模式

作者: Crazy贵子 | 来源:发表于2018-05-18 12:28 被阅读0次

    策略模式

    定义

    通用类图

    通用类图.png

    说明:Strategy是算法接口,ConcreteStrategy是算法的具体实现,Context作用就是将算法封装起来。

    通用代码

    // 策略
    public interface Strategy {
        public void doSomething();
    }
    
    // 具体策略
    public class ConcreteStrategy implements Strategy {
        @Override
        public void doSomething() {
            // 具体算法
        }
    }
    
    // 算法封装
    public class Context {
        private Strategy strategy;
    
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
    
        public void doSomething() {
            strategy.doSomething();
        }
    }
    
    // 客户端调用
    public class Client {
    
        public static void main(String[] args) {
            Strategy strategy = new ConcreteStrategy();
            Context context = new Context(strategy);
            context.doSomething();
        }
    }
    
    

    样例展示

    在图书销售时,根据不同类型的图书有不同的折扣,计算金额时必须区别对待,例如计算机类图书7折,英语类图书6折。

    分析:这里的策略是打折,具体打折策略是计算机7折,英语6折,然后将这些打折策略封装起来给客户端调用。

    样例类图

    样例类图.png

    样例代码

    // 策略接口
    public interface Discount {
        public float discount(float price);
    }
    
    // 计算机打7折
    public class ComputerDiscount implements Discount {
        @Override
        public float discount(float price) {
            return (float) (price * 0.7);
        }
    }
    
    // 英语打6折
    public class EnglishDiscount implements Discount {
        @Override
        public float discount(float price) {
            return (float) (price * 0.6);
        }
    }
    
    // 封装算法
    public class Context {
    
        private Discount discount;
    
        public Context(Discount discount) {
            this.discount = discount;
        }
    
        public float sale(float price) {
            return discount.discount(price);
        }
    }
    
    // 客户端调用
    public class Client {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            float price = scanner.nextFloat();
            String classification = new Scanner(System.in).next();
            Context context = null;
            if ("计算机".equals(classification)) {
                context = new Context(new ComputerDiscount());
            } else if ("英语".equals(classification)) {
                context = new Context(new EnglishDiscount());
            }
    
            System.out.println(context.sale(price));
        }
    }
    

    当然,这里可以巧用枚举完成相同的功能

    public enum Discount {
        COMPUTER_DISCOUNT() {
            @Override
            public float discount(float price) {
                return (float) (price * 0.7);
            }
        },
        ENGLISH_DISCOUNT() {
            @Override
            public float discount(float price) {
                return (float) (price * 0.6);
            }
        };
    
        public abstract float discount(float price);
    }
    
    // 客户端调用
     public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            float price = scanner.nextFloat();
            String classification = new Scanner(System.in).next();
            if ("计算机".equals(classification)) {
                System.out.println(Discount.COMPUTER_DISCOUNT.discount(price));
            } else if ("英语".equals(classification)) {
                System.out.println(Discount.ENGLISH_DISCOUNT.discount(price));
            }
        }
    

    本文为《设计模式之禅》读后笔记总结

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/echgdftx.html