zoukankan      html  css  js  c++  java
  • 面向对象设计模式之策略模式

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

    2.抽象鸭子类,鸭子飞行行为在此处类似于算法族

     1 package com.pattern.strategy;
     2 /**
     3  * 抽象鸭子
     4  * @author Administrator
     5  *
     6  */
     7 public abstract class Duck {
     8     
     9     FlyBehavior fb;//行为接口声明两个引用变量,所有鸭子子类都继承他
    10     Quack q; //鸭子鸣叫行为接口
    11     
    12 
    13     //加入两个set方法,用来改变鸭子的行为
    14     public void setFb(FlyBehavior fb) {
    15         this.fb = fb;
    16     }
    17 
    18     public void setQ(Quack q) {
    19         this.q = q;
    20     }
    21 
    22     public Duck() {
    23         // TODO Auto-generated constructor stub
    24     }
    25     
    26     public abstract void display();//展示鸭子的样子,不同的鸭子样子不一样
    27     
    28     //鸭子的飞行委托给行为类
    29     public void performFly(){
    30         fb.fly();
    31     }
    32     
    33     public void performQuack(){
    34         q.quack();
    35     }
    36     //所有的鸭子都会游泳
    37     public void swim(){
    38         System.out.println("all ducks float,even decoys!");
    39     }
    40 
    41 }

    3.鸭子飞行行为接口

     1 package com.pattern.strategy;
     2 /**
     3  * 所有飞行行为类必须实现此接口
     4  * @author Administrator
     5  *
     6  */
     7 public interface FlyBehavior {
     8     
     9     public void fly();
    10     
    11     
    12 
    13 }
    14 /**
    15  * 飞行行为的实现者,给真会飞的鸭子用
    16  * @author Administrator
    17  *
    18  */
    19 class FlyWithWings implements FlyBehavior{
    20 
    21     @Override
    22     public void fly() {
    23         System.out.println("I AM FLYING!");
    24         
    25     }
    26     
    27 }
    28 /**
    29  * 飞行行为的实现者,给不会飞的鸭子用
    30  * @author Administrator
    31  *
    32  */
    33 class FlyNoWay implements FlyBehavior{
    34 
    35     @Override
    36     public void fly() {
    37         System.out.println("I CANT'T FLY!");
    38         
    39     }
    40     
    41 }
    42 /**
    43  * 增加一个火箭动力飞行行为
    44  * @author Administrator
    45  *
    46  */
    47 class RocketFly implements FlyBehavior{
    48 
    49     @Override
    50     public void fly() {
    51         System.out.println("一飞冲天");
    52         
    53     }
    54     
    55 }

    4.鸭子鸣叫行为接口

    package com.pattern.strategy;
    /**
     * 所有鸣叫行为类必须实现此接口
     * @author Administrator
     *
     */
    public interface Quack {
        
        public void quack();
    
    }
    //呱呱叫的行为实现
    class QQuack implements Quack{
    
        @Override
        public void quack() {
            System.out.println("quack quack!");
            
        }
        
    }
    //吱吱叫的行为实现
    class Squack implements Quack{
    
        @Override
        public void quack() {
            System.out.println("ZHI ZHI");
            
        }
        
    }
    /**
     * 不会叫的行为实现
     * @author Administrator
     *
     */
    class Silence implements Quack{
    
        @Override
        public void quack() {
            System.out.println("silence");
            
        }
        
    }

    5.鸭子的实现类绿头鸭,会飞也会叫

    package com.pattern.strategy;
    /**
     * 鸭子的实现类,绿头鸭
     * @author Administrator
     *
     */
    public class MallDuck extends Duck {
        
    
        public MallDuck() {
            super();
            fb = new FlyWithWings();//绿头鸭带翅膀会飞
            q  = new QQuack();//绿头鸭是呱呱叫
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void display() {
            System.out.println("i am  a MallDuck");
    
        }
    
    }

    6.鸭子实现类模型鸭子,不会飞,也不会叫

    package com.pattern.strategy;
    /**
     * 模型鸭子
     * @author Administrator
     *
     */
    public class ModelDuck extends Duck {
        
    
        public ModelDuck() {
    
            super();
            fb = new FlyNoWay();
            q = new Silence();
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void display() {
            System.out.println("我 是 模型 鸭子");
    
        }
    
    }

    7.客户端测试代码

    package com.pattern.strategy;
    /**
     * 测试类,把行为看做一个算法族,算法代表鸭子能做的事,客户使用封装好的飞行和呱呱叫算法族
     * 这种做法就是组合,鸭子的行为不是继承来的,而是适当的行为对象组合来的,如FlyBehavior和Quack
     * 使用组合将算法组封装成类,可以运行时动态的改变行为
     * @author Administrator
     *
     */
    public class Simulator {
    
        public static void main(String[] args) {
            Duck d = new MallDuck();
            d.performFly();
            d.performQuack();
            
            Duck model = new ModelDuck();
            model.performFly();//模型鸭子不会飞
            //我突然想让他飞
            model.setFb(new RocketFly());//运行时改变鸭子的行为,只需要调用set方法即可
            model.performFly();
    
        }
    
    }

    8.测试结果

    9.

    常见开发中场景:
    ---JAVASE中GUI编程,布局管理
    ---Spring框架中,Resource接口,资源访问策略
    ---javax.servlet.http.HttpServlet#service();

    需要程序源码的可以加我微信x241602私聊。
  • 相关阅读:
    孙权用人之道:“六力”兼备
    JDK 自带工具试用(一)
    Apache ab 测试工具使用(一)
    Amoeba详细介绍
    TCP/IP 标志位 SYN ACK RST UTG PSH FIN
    ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
    jsp 中声明方法的使用
    Java遍历一个文件夹下的全部文件
    WAMP 2.5 "FORBIDDEN" error
    LeetCode总结--二分查找篇
  • 原文地址:https://www.cnblogs.com/huipengbo/p/6876377.html
Copyright © 2011-2022 走看看