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

    策略模式

    1. 策略模式( Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式.让算法的变化独立于使用算法的客户
    2. 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口) ;第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。

    image-20200731184524576

    应用实例:策略模式解决鸭子问题

    1. 有各种鸭子(比如野鸭、北京鸭、水鸭等,鸭子有各种行为, 比如叫、飞行等)
    2. 显示鸭子的信息
    public abstract class Duck {
    
       //属性, 策略接口
       FlyBehavior flyBehavior;
       //其它属性<->策略接口
       QuackBehavior quackBehavior;
       
       public Duck() {
       
       }
    
       public abstract void display();//显示鸭子信息
       
       public void quack() {
          System.out.println("鸭子嘎嘎叫~~");
       }
       
       public void swim() {
          System.out.println("鸭子会游泳~~");
       }
       
       public void fly() {
          
          //改进
          if(flyBehavior != null) {
             flyBehavior.fly();
          }
       }
    
       public void setFlyBehavior(FlyBehavior flyBehavior) {
          this.flyBehavior = flyBehavior;
       }
       
       
       public void setQuackBehavior(QuackBehavior quackBehavior) {
          this.quackBehavior = quackBehavior;
       }
       
    }
    
    public interface FlyBehavior {
       
       void fly(); // 子类具体实现
    }
    
    public interface QuackBehavior {
       void quack();//子类实现
    }
    
    public class BadFlyBehavior implements FlyBehavior {
    
       @Override
       public void fly() {
          // TODO Auto-generated method stub
          System.out.println(" 飞翔技术一般 ");
       }
    
    }
    
    public class GoodFlyBehavior implements FlyBehavior {
    
       @Override
       public void fly() {
          // TODO Auto-generated method stub
          System.out.println(" 飞翔技术高超 ~~~");
       }
    
    }
    
    public class NoFlyBehavior implements FlyBehavior{
    
       @Override
       public void fly() {
          // TODO Auto-generated method stub
          System.out.println(" 不会飞翔  ");
       }
    
    }
    
    public class PekingDuck extends Duck {
    
       
       //假如北京鸭可以飞翔,但是飞翔技术一般
       public PekingDuck() {
          // TODO Auto-generated constructor stub
          flyBehavior = new BadFlyBehavior();
          
       }
       
       @Override
       public void display() {
          // TODO Auto-generated method stub
          System.out.println("~~北京鸭~~~");
       }
    
    }
    
    public class ToyDuck extends Duck{
    
       
       public ToyDuck() {
          // TODO Auto-generated constructor stub
          flyBehavior = new NoFlyBehavior();
       }
       
       @Override
       public void display() {
          // TODO Auto-generated method stub
          System.out.println("玩具鸭");
       }
    
       //需要重写父类的所有方法
       
       public void quack() {
          System.out.println("玩具鸭不能叫~~");
       }
       
       public void swim() {
          System.out.println("玩具鸭不会游泳~~");
       }
       
       
    }
    
    public class WildDuck extends Duck {
    
       
       //构造器,传入FlyBehavor 的对象
       public  WildDuck() {
          // TODO Auto-generated constructor stub
          flyBehavior = new GoodFlyBehavior();
       }
       
       
       @Override
       public void display() {
          // TODO Auto-generated method stub
          System.out.println(" 这是野鸭 ");
       }
    
    }
    
    public class Client {
    
       public static void main(String[] args) {
          // TODO Auto-generated method stub
          WildDuck wildDuck = new WildDuck();
          wildDuck.fly();//
          
          ToyDuck toyDuck = new ToyDuck();
          toyDuck.fly();
          
          PekingDuck pekingDuck = new PekingDuck();
          pekingDuck.fly();
          
          //动态改变某个对象的行为, 北京鸭 不能飞
          pekingDuck.setFlyBehavior(new NoFlyBehavior());
          System.out.println("北京鸭的实际飞翔能力");
          pekingDuck.fly();
       }
    
    }
    

    策略模式的注意事项和细节

    1. 策略模式的关键是:分析项目中变化部分与不变部分
    2. 策略模式的核心思想是:多用组合/聚合少用继承;用行为类组合,而不是行为的继承。更有弹性
    3. 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if else if else)
    4. 提供了可以替换继承关系的办法:策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展
    5. 需要注意的是:每添加一个 策略就要增加一个类,当策略过多是会导致类数目过多
  • 相关阅读:
    SGU 495 Kids and Prizes 概率DP 或 数学推理
    poj 2799 IP Networks 模拟 位运算
    uva 202 Repeating Decimals 模拟
    poj 3158 Kickdown 字符串匹配?
    uva 1595 Symmetry 暴力
    uva 201 Squares 暴力
    uva 1594 Ducci Sequence 哈希
    uva 1368 DNA Consensus String 字符串
    数字、字符串、列表的常用操作
    if条件判断 流程控制
  • 原文地址:https://www.cnblogs.com/junlinsky/p/14068032.html
Copyright © 2011-2022 走看看