zoukankan      html  css  js  c++  java
  • Java设计模式--策略模式

    1.策略模式

    1.1定义

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

    1.2 底层机制

    将有共性的行为抽象为一个接口,其中有此种行为的声明。该接口的实现类都实现了这个行为,但是提供了不同的行为表现。在执行此类行为的类中含有该接口的引用,在执行行为前要确定该行为的表现,选择适合的执行。

    1.3体现的设计原则

    1、把会变化的部分取出并“封装”起来,好让其他部分不会受到影响。

    2、针对接口编程,而不是针对实现编程。

    3、多用组合,少用继承。

    1.4优缺点

    优点:

    1、可以避免代码重复。

    2、扩展性良好。在添加新的行为时,不用修改写好的代码。

    3、算法可以自由切换。

    缺点:

    1、策略模式只适用于客户端知道所有的算法或行为的情况。

    2、策略模式造成很多策略类,每个具体策略类都会产生一个新类。

    1.5案例:模拟鸭子游戏

    1.5.1类图

    1.5.2 代码逻辑

    1、取出易于变化的部分,将其封装成类,建立一组新的类来表示每个行为。首先,在Duck类中“加入两个实例变量”,分别为“FlyBehavior”与“QuackBehavior”,声明成接口类型(不是具体的实现类型)。

    2、Duck类中实现“performFly()”与“performQuack()”,在这个方法中鸭子不会亲自处理飞和呱呱叫的行为,而是委托给行为类处理。

    3、实现具体类型的鸭子类。

    4、编写测试类。

    1.5.3代码实现

    1、实现“飞”和“叫”行为的封装,定义成接口类型。

         public interface FlyBehavior {

    public void fly();

       }

      public interface QuackBehavior {

       public void quack();

       }

    2、实现鸭子类,定义成抽象类。(通过set方法动态设置鸭子的行为)

    public abstract class Duck {

    FlyBehavior flyBehavior;

    QuackBehavior quackBehavior;

    abstract void display();

    public Duck() {

    }

    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 ducks float, even decoys!");

    }

    }

    3、编写具体的行为。

           所有飞行行为类

    public class FlyWithWings implements FlyBehavior {

    public void fly() {

    System.out.println("I'm flying!!");

    }

    }

    public class FlyNoWay implements FlyBehavior {

    public void fly() {

    System.out.println("I can't fly");

    }

    }

       所有叫的行为类

    public class Quack implements QuackBehavior {

    public void quack() {

    System.out.println("Quack");

    }

    }

    public class Squeak implements QuackBehavior {

    public void quack() {

    System.out.println("Squeak");

    }

    }

    public class MuteQuack implements QuackBehavior {

    public void quack() {

    System.out.println("<< Silence >>");

    }

    }

    4、建立一个新的鸭子类:

    public class ModelDuck extends Duck {

    public ModelDuck() {

    flyBehavior = new FlyNoWay();

    quackBehavior = new Quack();

    }

    public void display() {

    System.out.println("I'm a model duck");

    }

    }

    5、添加一个新的飞行类型。

    public class FlyRocketPowered implements FlyBehavior {

    public void fly() {

    System.out.println("I'm flying with a rocket");

    }

    }

    6、编写测试类

    public class MiniDuckSimulator1 {

    public static void main(String[] args) {

    Duck model = new ModelDuck();

    model.performQuack();

    model.performFly();

    model.setFlyBehavior(new FlyRocketPowered());

    model.performFly();

    }

       }

    7、

     
       

    运行结果

    1.6思维拓展

    1、设计模式的基础包括:抽象、封装、多态、继承。

    2、MQ

    3、WEBSERIVE

    1.7应用场景

    1、在一个系统种多个类之间的区别仅在于他们的行为不同。

    2、需要在不同情况下使用不用的策略(算法),或者策略还可能在未来用其他方式来实现。

    3、对客户隐藏具体策略算法的细节,实现彼此完全独立。

    1.8应用实例

    1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。

    2、旅行的出游方式,选择不同的出行工具,每一种旅行方式都是一个策略

    1.9注意事项

    1、如果一个系统的策略多于四个,就考虑使用混合模式,解决策略类膨胀的问题。

  • 相关阅读:
    大型网站技术架构读书笔记目录
    读书笔记1: 大型网站架构演化
    关于HTML5中的canvas标签的个个人理解
    javascript的部分功能实现
    简易计算机的做法
    关于C语言的学习和理解
    体验LESS CSS 框架
    在学习ps中的问题和理解。
    关于做登录页面
    css实现动画功能
  • 原文地址:https://www.cnblogs.com/Sweethoney/p/6485238.html
Copyright © 2011-2022 走看看