zoukankan      html  css  js  c++  java
  • 设计模式之策略模式Strategy

    /**
     * 策略设计模式
     * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为。
     * 问题:设计一个鸭子模拟游戏。
     * 现在有一群鸭子:
     * ①这些鸭可以有飞的行为(分为快和慢),也可以没有飞的行为;
     * ②对于鸭的叫声有沉默,也有响亮地叫,或者说也有小声地叫。那么按照我们平时的设计习惯,我们首先会定义一个父类(鸭),
     * 然后我们将这两种行为排列组合将产生3*3=9个鸭子的子类,这是一件多么费体力的事情。如果说还有另外一些行为呢,那又要乘了,所以这种设计方式显然不好。
     * 我们现在采用策略设计模式:将行为抽象定义成各个接口,然后将他们的具体行为封装成各个对象,使这些对象可以相互转换。
     * User: HYY
     * Date: 13-11-11
     * Time: 下午11:31
     * To change this template use File | Settings | File Templates.
     */
    abstract class Duck {
        protected FlyBehavior flyBehavior;
        protected QuackBehavior quackBehavior;
    
        public void performFly() {
            this.flyBehavior.fly();
        }
    
        public void performQuack() {
            this.quackBehavior.quack();
        }
    
        //鸭子的外观
        public abstract void display();
    
        //以下两个setter用于动态的设置鸭的行为
        void setFlyBehavior(FlyBehavior flyBehavior) {
            this.flyBehavior = flyBehavior;
        }
    
        void setQuackBehavior(QuackBehavior quackBehavior) {
            this.quackBehavior = quackBehavior;
        }
    }
    
    //以下定义两个行为接口
    interface FlyBehavior {
        public void fly();
    }
    
    interface QuackBehavior {
        public void quack();
    }
    
    //以下四个类定义具体的“飞”和“鸭叫”行为
    class HighSpeedFlyBehavior implements FlyBehavior {
        public void fly() {
            System.out.println("我正在高速飞翔!");
        }
    }
    
    class SlowSpeedFlyBehavior implements FlyBehavior {
        public void fly() {
            System.out.println("我正在缓慢飞翔!");
        }
    }
    
    class SilenceQuackBehavior implements QuackBehavior {
        public void quack() {
            System.out.println("- - - - - 沉默地叫 - - - - ");
        }
    }
    
    class LoudQuackBehavior implements QuackBehavior {
        public void quack() {
            System.out.println("我正在大声地叫喊!");
        }
    }
    
    //下面两个类继承Duck类,是具体的鸭种类
    
    /**
     * 这个是绿头鸭子类(假设飞的慢而没有叫声)
     */
    class MallardDuck extends Duck {
        public MallardDuck() {
            super();
            this.flyBehavior = new SlowSpeedFlyBehavior();
            this.quackBehavior = new SilenceQuackBehavior();
        }
    
        @Override
        public void display() {
            System.out.println("我是绿头鸭子!");
        }
    }
    
    /**
     * 这个是红头鸭子(假设飞的快而且叫声响亮)
     */
    class RedheadDuck extends Duck {
    
        public RedheadDuck() {
            super();
            this.flyBehavior = new HighSpeedFlyBehavior();
            this.quackBehavior = new LoudQuackBehavior();
        }
    
        @Override
        public void display() {
            System.out.println("我是红头鸭子!");
        }
    }
    public class Main {
        public static void main(String[] args) {
            Duck redheadDuck = new RedheadDuck();
            redheadDuck.display();
            redheadDuck.performFly();
            redheadDuck.performQuack();
            //动态改变红头鸭子的飞和叫行为
            System.out.println("———————————————————————————————————");
            redheadDuck.setFlyBehavior(new SlowSpeedFlyBehavior());
            redheadDuck.setQuackBehavior(new SilenceQuackBehavior());
            redheadDuck.performFly();
            redheadDuck.performQuack();
        }
    }
  • 相关阅读:
    VS创建MVC出错解决方法
    服务器环境~某个页面无法访问的处理
    SSIS 处理错误的方法
    SSIS 数据流的执行树和数据管道
    利用SSIS的ForcedExecutionResult 属性 和CheckPoint调试Package
    处于同一域中的两台SQL Server 实例无法连接
    SQL Server 日期和时间类型
    Lookup 转换组件
    约束2:主键约束,唯一约束和唯一索引
    查询语句影响的行数
  • 原文地址:https://www.cnblogs.com/wuyou/p/3418772.html
Copyright © 2011-2022 走看看