zoukankan      html  css  js  c++  java
  • 策略模式

    1.定义

    定义了算法族,分别封装起来,让它们之前可以互相替换,此模式让算法的变化独立于使用算法的客户.

    2.代码演示------来自head first 设计模式

    假设有许多鸭子,绿头鸭,模型鸭,玩具鸭,有的鸭子会飞,有的鸭子会叫,有的鸭子不会飞,有的鸭子不会叫,这边会飞和不会飞,会叫和不会叫都是相同的行为,一个是飞,一个是不会飞,这边可以单独抽象成两个接口

    定义一个飞行接口

    public interface FlyBehavior {
        void fly();
    }

    定义一个'叫'接口

    public interface QuackBehavior {
        void quack();
    }

    然后飞行行为可以有  靠翅膀飞行,或者靠一个火箭飞行器飞行,实现类分别如下

    public class FlyWithWings implements FlyBehavior{
    
        @Override
        public void fly() {
            System.out.println(" fly with wings");
        }
        
    
    }
    public class FlyNoWay implements FlyBehavior{
    
        @Override
        public void fly() {
            System.out.println("fly no way");
        }
        
    }
    public class FlyRocketPowered implements FlyBehavior{
    
        @Override
        public void fly() {
            System.out.println("I'm flying with a rocket!");
        }
    
    }

    '叫'行为可以有呱呱叫(quack),吱吱叫(squeak),和不发出叫声(mutesquack),实现类如下

    public class Quack implements QuackBehavior{
    
        @Override
        public void quack() {
            System.out.println("quack quack quack");
        }
        
    }
    public class Squeak implements QuackBehavior{
    
        @Override
        public void quack() {
            System.out.println("Squeak Squeak Squeak");
        }
    
    }
    public class MuteQuack implements QuackBehavior{
    
        @Override
        public void quack() {
            System.out.println("MuteQuack MuteQuack MuteQuack");
        }
    
    }

    定义了鸭子的各种行为实现后,我们就可以定义抽象类鸭子了,这边有意思的就是把行为都抽象成一个方法,'不会飞'也单独作为一个类来表示

    定义抽象鸭子类

    public abstract class Duck {
        FlyBehavior flyBehavior;
        QuackBehavior quackBehavior;
        
        void performQuack() {
            quackBehavior.quack();
        }
        void performFly() {
            flyBehavior.fly();
        }
        public void setFlyBehavior(FlyBehavior flyBehavior) {
            this.flyBehavior = flyBehavior;
        }
        public void setQuackBehavior(QuackBehavior quackBehavior) {
            this.quackBehavior = quackBehavior;
        }
        
    }

    这边通过组合来实现 飞行为 和'叫'行为,如果是不会飞的鸭子,直接把 FlyNoWay赋值给 flyBehavior类即可.

    编写测试类

    public class MiniDuckSimulator {
        public static void main(String[] args) {
            
            Duck model = new ModelDuck();
            model.performFly();
            model.setFlyBehavior(new FlyRocketPowered());
            model.performFly();
        }
    }

    这里我们可以看到,通过set方法可以随时改变行为(策略);

    3.总结

    鸭子的  飞 和叫  可以抽象成行为,通过组合方式来实现每一种鸭子的行为.  就是给抽象成接口的行为赋值来实现具体的 飞 和叫 ;

  • 相关阅读:
    滚动条去掉
    js 类继承extends
    html标签分类
    Freemarker模板引擎
    关于SpringMVC控制器的一点补充
    Maven的使用
    多层嵌套的json数据
    前后端数据交互之数据接口
    ES6浅谈之Promise
    ES6(阮一峰)学习总结
  • 原文地址:https://www.cnblogs.com/lishuaiqi/p/11080127.html
Copyright © 2011-2022 走看看