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

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

    设计原则:1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。(把变化的飞行行为、呱呱叫行为从不变的鸭子类中取出来)

          

         2、针对接口编程,而不是针对实现编程。(FlyBehavior、QuackBehavior)

            3、多用组合,少用继承。(有一个比是一个更好)

          

    Talk is cheap,

    Duck类:

    public abstract class Duck {
    
        /*
        * 行为接口
        * */
        FlyBehavior flyBehavior;
        QuackBehavior quackBehavior;
    
        public Duck(){
    
        }
        public abstract void dispaly();
    
    
        /*
        * 设定鸭子的行为
        * */
        public void setFlyBehavior(FlyBehavior fb){
            flyBehavior = fb;
        }
    
        public void setQuackBehavior(QuackBehavior qb){
            quackBehavior = qb;
        }
    
        /*
        * 委托给行为类
        * */
        public void performFly(){
            flyBehavior.fly();
        }
    
        public void performQuack(){
            quackBehavior.quack();
        }
    
        public void swim(){
            System.out.println("All dusks float,even decoys");
        }
    
    }

    Fly接口、Quack接口:

    /*
    * 飞行接口
    * */
    public interface FlyBehavior {
        public void fly();
    }
    
    public interface QuackBehavior {
        public void quack();
    }

    实现:

    /*
    * 不会飞的鸭子的行为
    * */
    public class FlyNoWay implements FlyBehavior{
        @Override
        public void fly() {
            System.out.println("i cant fly!!");
        }
    }
    
    public class FlyRocketPowered implements FlyBehavior{
        @Override
        public void fly() {
            System.out.println("i'm flying with a rocket!");
        }
    }
    
    /*
    *真会飞的鸭子的行为
    * */
    public class FlyWithWings implements FlyBehavior{
        @Override
        public void fly() {
            System.out.println("i'm flying !!");
        }
    }
    public class MuteQuack implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("<Since>");
        }
    }
    
    public class Quack implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("Quack");
        }
    }
    
    public class Squeak implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("Sqeak");
        }
    }

    子类:

    public class MallardDuck extends Duck{
        public MallardDuck(){
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();
        }
    
        @Override
        public void dispaly() {
            System.out.println("i'm a real Mallard duck!");
        }
    }
    
    public class ModelDuck extends Duck{
        public ModelDuck(){
            flyBehavior = new FlyNoWay();
            quackBehavior = new MuteQuack();
        }
    
        @Override
        public void dispaly() {
            System.out.println("i'm a model duck!");
        }
    
    }

    测试:

    public class MiniDuckSimulator {
        public static void main(String[] args){
            Duck mallard = new MallardDuck();
            mallard.performFly();//调用MallardDuck继承的performFly()方法,进而委托给该对象的FlyBehaviour处理
            mallard.performQuack();
    
            Duck model1 = new ModelDuck();
            model1.performFly();
            model1.setFlyBehavior(new FlyRocketPowered());//动态的改变飞行行为
            model1.performFly();
        }
    }
  • 相关阅读:
    nodeJS学习(8)--- WS/...开发 NodeJS 项目-节3 <使用 mongodb 完整实例过程>
    nodeJS学习(7)--- WS开发 NodeJS 项目-节2 <安装&设置&启动 mongodb 数据库++遇到的问题>
    nodeJS学习(6)--- Sublime Text3 配置Node.js 开发环境
    nodeJS学习(5) --- sublime Text3 安装使用
    nodeJS学习(4)--- webstorm/...开发 NodeJS 项目-节1
    nodeJS学习(3)--- npm 配置和安装 express4.X 遇到的问题及解决
    二叉查找树-优化版,使用了指针引用
    二叉查找树实现-双向链表
    数据结构-中序转后序
    MySQL 游戏排行榜
  • 原文地址:https://www.cnblogs.com/tshua/p/5575786.html
Copyright © 2011-2022 走看看