zoukankan      html  css  js  c++  java
  • 策略模式------《Head First 设计模式》

    第一章---策略模式

    xzmxddx

      学习方式:书籍《Head First 设计模式》,这本书通俗易懂,所有知识点全部取自本书。

    面向对象设计原则

    • 封装变化
    • 多用组合,少用继承
    • 针对接口编程,不针对实现编程
    • 为交互对象之间的松耦合设计而努力
    • 类应该对扩展开放,对修改关闭
    • 依赖抽象,不要依赖具体类
    • 只和朋友交谈
    • 别找我,我会找你
    • 类应该只有一个改变的理由

    一、定义

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

      我的理解:举个例子,玩小游戏的时候,我们需要切换武器,每个武器对象所对应的行为不同,但是我们将这些武器(算法族)封装起来,让它们独立替换,不同的武器,有着不同的效果,这里就可以使用策略模式,武器们实现一个共同的接口即可

    二、UML类图

      这里我使用了鸭子会飞,会叫,这两个行为的例子,鸭子叫声不一样(算法族),飞行行为也不一样(算法族)

      eclipse截图:

      

      

    三、代码示例

      鸭子抽象类以及子类:

      Duck

    package hue.edu.xiong.first.duck;
    
    import hue.edu.xiong.first.fly.FlyBehavior;
    import hue.edu.xiong.first.quack.QuackBehavior;
    
    public abstract class Duck {
        FlyBehavior flyBehavior;
        QuackBehavior quackBehavior;
    
        public abstract void display();
    
        public void performFly() {
            flyBehavior.fly();
        }
    
        public void performQuack() {
            quackBehavior.quack();
        }
    
        public void swim() {
            System.out.println("All ducks float,even decoys!!");
        }
    
        public void setFlyBehavior(FlyBehavior flyBehavior) {
            this.flyBehavior = flyBehavior;
        }
    
        public void setQuackBehavior(QuackBehavior quackBehavior) {
            this.quackBehavior = quackBehavior;
        }
    }

      MallardDuck

    package hue.edu.xiong.first.duck;
    
    import hue.edu.xiong.first.fly.FlyWithWings;
    import hue.edu.xiong.first.quack.Quack;
    
    public class MallardDuck extends Duck {
        public MallardDuck() {
            flyBehavior = new FlyWithWings();
            quackBehavior = new Quack();
        }
    
        @Override
        public void display() {
            System.out.println("It is MallardDuck!!!");
        }
    
    }

      ModelDuck

    package hue.edu.xiong.first.duck;
    
    import hue.edu.xiong.first.fly.FlyNoWay;
    import hue.edu.xiong.first.quack.Quack;
    
    public class ModelDuck extends Duck {
        public ModelDuck() {
            flyBehavior = new FlyNoWay();
            quackBehavior = new Quack();
        }
    
        @Override
        public void display() {
            System.out.println("It is ModelDuck!!!");
        }
    
    }

       飞行行为接口,以及实现类

      FlyBehavior 
    package hue.edu.xiong.first.fly;
    
    public interface FlyBehavior {
        public abstract void fly();
    }
      FlyNoWay 
    package hue.edu.xiong.first.fly;
    
    public class FlyNoWay implements FlyBehavior {
    
        @Override
        public void fly() {
            System.out.println("I can't fly!!");
        }
    
    }

      FlyRocketPowered 

    package hue.edu.xiong.first.fly;
    
    public class FlyRocketPowered implements FlyBehavior {
    
        @Override
        public void fly() {
            System.out.println("I'm flying with a rocket!!");
        }
    
    }  
      FlyWithWings 
    package hue.edu.xiong.first.fly;
    
    public class FlyWithWings implements FlyBehavior {
    
        @Override
        public void fly() {
            System.out.println("I'm flying!!");
        }
    
    }

      叫声接口,以及实现类

       QuackBehavior

    package hue.edu.xiong.first.quack;
    
    public interface QuackBehavior {
        public abstract void quack();
    }

       Quack 

    package hue.edu.xiong.first.quack;
    
    public class Quack implements QuackBehavior {
    
        @Override
        public void quack() {
            System.out.println("Quack");
        }
    
    }
    MuteQuack 
    package hue.edu.xiong.first.quack;
    
    public class MuteQuack implements QuackBehavior {
    
        @Override
        public void quack() {
            System.out.println("<< Silence >>");
        }
    
    }
    Squeak 
    package hue.edu.xiong.first.quack;
    
    public class Squeak implements QuackBehavior {
    
        @Override
        public void quack() {
            System.out.println("Squeak");
        }
    
    }

    四、Main类解析

     1 package hue.edu.xiong.first;
     2 
     3 import hue.edu.xiong.first.duck.Duck;
     4 import hue.edu.xiong.first.duck.MallardDuck;
     5 import hue.edu.xiong.first.fly.FlyNoWay;
     6 import hue.edu.xiong.first.quack.MuteQuack;
     7 
     8 public class Main {
     9 
    10     public static void main(String[] args) {
    11         //声明并实例化一只MallardDuck
    12         Duck duck = new MallardDuck();
    13         //测试已经封装的行为
    14         duck.performFly();
    15         duck.performQuack();
    16         duck.display();
    17         //更改已经封装的行为,策略模式要点
    18         duck.setFlyBehavior(new FlyNoWay());
    19         duck.setQuackBehavior(new MuteQuack());
    20         //测试
    21         duck.performFly();
    22         duck.performQuack();
    23 //        I'm flying!!
    24 //        Quack
    25 //        It is ֻMallardDuck!!!
    26 //        I can't fly!!
    27 //        << Silence >>
    28     }
    29 
    30 }

    五、总结

     策略模式是我接触到的第一个模式,很好理解,下一个模式是观察者模式

  • 相关阅读:
    反应堆模式
    ABP领域层——仓储(Repositories)
    如何使用ASP.NET Web API OData在Oracle中使用Entity Framework 6.x Code-First方式开发 OData V4 Service
    dapper的Dapper-Extensions用法(一)
    VisualStudio 怎么使用Visual Leak Detector
    Visual Studio Code开发TypeScript
    Topshelf创建Windows服务
    ENode框架初始化
    知已者明(转)
    配置静态监听解决ORA-12514错误的案例(转)
  • 原文地址:https://www.cnblogs.com/xzmxddx/p/8994789.html
Copyright © 2011-2022 走看看