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


    策略模式定义了算法簇,分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的使用者。

    系统描述:各种不同的鸭子,有的可以飞,有点不可以飞,不同的鸭子叫声也不一定相同。

    定义一个鸭子的超类Duck,其他具体的鸭子继承该超类,将鸭子的飞的行为和叫的行为分别封装到接口中

    鸭子的超类:

    package cn.lan.duck;
    
    import cn.lan.duck.behavior.FlyBehavior;
    import cn.lan.duck.behavior.QuackBehavior;
    /**
     * 鸭子的超类
     * @author wy
     *
     */
    public abstract class Duck {
    
    	//飞行行为的接口
    	FlyBehavior flyBehavior;
    	//叫声行为的接口
    	QuackBehavior quackBehavior;
    
    	public Duck() {
    
    	}
    	//执行飞行为的方法
    	public void performFly() {
    		flyBehavior.fly();
    	}
    	//执行叫行为的方法
    	public void performQuack() {
    		quackBehavior.quack();
    	}
    	//执行游泳的方法
    	public void swim() {
    		System.out.println("all ducks can swim....");
    	}
    	
    	public void setFlyBehavior(FlyBehavior flyBehavior) {
    		this.flyBehavior = flyBehavior;
    	}
    
    	public void setQuackBehavior(QuackBehavior quackBehavior) {
    		this.quackBehavior = quackBehavior;
    	}
    }
    
    飞行行为的接口

    package cn.lan.duck.behavior;
    /**
     * 飞行行为的接口
     * @author wy
     *
     */
    public interface FlyBehavior {
    
    	public void fly();
    }
    
    叫声的接口

    package cn.lan.duck.behavior;
    /**
     * 叫行为的接口
     * @author wy
     *
     */
    public interface QuackBehavior {
    
    	public void quack();
    }
    
    具体的实现类

    package cn.lan.duck.behavior.impl;
    
    import cn.lan.duck.behavior.FlyBehavior;
    /**
     * 飞行行为的实现类:不能飞
     * @author wy
     *
     */
    public class FlyNoWays implements FlyBehavior {
    
    	@Override
    	public void fly() {
    		// TODO Auto-generated method stub
    		System.out.println("can not fly...");
    	}
    
    }
    

    package cn.lan.duck.behavior.impl;
    
    import cn.lan.duck.behavior.FlyBehavior;
    /**
     * 飞行行为的实现类:能飞
     * @author wy
     *
     */
    public class FlyWithWins implements FlyBehavior {
    
    	@Override
    	public void fly() {
    		// TODO Auto-generated method stub
    		System.out.println("flying .....");
    	}
    
    }
    

    package cn.lan.duck.behavior.impl;
    
    import cn.lan.duck.behavior.QuackBehavior;
    /**
     * 叫行为的实现类:mute
     * @author wy
     *
     */
    public class MuteQuack implements QuackBehavior {
    
    	@Override
    	public void quack() {
    		// TODO Auto-generated method stub
    		System.out.println("no sound...");
    	}
    
    }
    

    package cn.lan.duck.behavior.impl;
    
    import cn.lan.duck.behavior.QuackBehavior;
    /**
     * 叫行为的实现类:quack
     * @author wy
     *
     */
    public class Quack implements QuackBehavior {
    
    	@Override
    	public void quack() {
    		// TODO Auto-generated method stub
    		System.out.println("quack...");
    	}
    
    }
    
    package cn.lan.duck.behavior.impl;
    
    import cn.lan.duck.behavior.QuackBehavior;
    /**
     * 叫行为的实现类:squeak
     * @author wy
     *
     */
    public class SqueakQuack implements QuackBehavior {
    
    	@Override
    	public void quack() {
    		// TODO Auto-generated method stub
    		System.out.println("squeak...");
    	}
    
    }
    
    2种飞行实现类和3种叫实现类,再写3种不同的鸭子,每个鸭子的飞和叫的行为都不同,在他们各自的构造方法中绑定好了


    package cn.lan.duck;
    
    import cn.lan.duck.behavior.impl.FlyWithWins;
    import cn.lan.duck.behavior.impl.Quack;
    
    public class FirstDuck extends Duck {
    	public FirstDuck() {
    		quackBehavior = new Quack();
    		flyBehavior = new FlyWithWins();
    	}
    }
    
    package cn.lan.duck;
    
    import cn.lan.duck.behavior.impl.FlyNoWays;
    import cn.lan.duck.behavior.impl.MuteQuack;
    
    public class SecondDuck extends Duck {
    	public SecondDuck() {
    		quackBehavior = new MuteQuack();
    		flyBehavior = new FlyNoWays();
    	}
    }
    
    package cn.lan.duck;
    
    import cn.lan.duck.behavior.impl.FlyWithWins;
    import cn.lan.duck.behavior.impl.SqueakQuack;
    
    public class ThirdDuck extends Duck {
    	public ThirdDuck() {
    		quackBehavior = new SqueakQuack();
    		flyBehavior = new FlyWithWins();
    	}
    }
    
    再写个测试类:
    package test;
    
    import cn.lan.duck.Duck;
    import cn.lan.duck.FirstDuck;
    import cn.lan.duck.SecondDuck;
    import cn.lan.duck.ThirdDuck;
    import cn.lan.duck.behavior.impl.FlyNoWays;
    import cn.lan.duck.behavior.impl.FlyWithWins;
    
    public class DuckTest {
    
    	public static void main(String[] args) {
    		System.out.println("first duck:");
    
    		Duck firstDuck = new FirstDuck();
    		firstDuck.performFly();
    		firstDuck.performQuack();
    		firstDuck.swim();
    
    		System.out.println();
    		System.out.println("second duck:");
    
    		Duck secondDuck = new SecondDuck();
    		secondDuck.performFly();
    		secondDuck.performQuack();
    		secondDuck.swim();
    
    		System.out.println();
    		System.out.println("third duck:");
    
    		Duck thirdDuck = new ThirdDuck();
    		thirdDuck.performFly();
    		thirdDuck.performQuack();
    		thirdDuck.swim();
    		System.out.println("change third duck......");
    		thirdDuck.setFlyBehavior(new FlyNoWays());
    		thirdDuck.performFly();
    	}
    }
    

    这样就把各种行为和Duck类分开了,即使再添加一个新的鸭子类,只需要在这个新的鸭子类中的构造方法中添加属于它的行为即可;

    即使在新增一个鸭子行为,也只需要添加一个新的行为接口,然后在需要添加该行为的鸭子类中加上该接口即可;不会因为新增一个行为,

    导致大面积更改代码。


    输出结果为:

    first duck:
    flying .....
    quack...
    all ducks can swim....
    
    second duck:
    can not fly...
    no sound...
    all ducks can swim....
    
    third duck:
    flying .....
    squeak...
    all ducks can swim....
    change third duck......
    can not fly...






  • 相关阅读:
    项目管理--项目干系人与组织
    项目管理--项目生命周期概述
    项目管理--简介
    算法学习之冒泡排序,6174问题
    算法学习之基础题
    PHP5.3.8连接Sql Server SQLSRV30
    解决:安装SQl 2008为SQL Server代理服务提供的凭据无效
    Sublime Text2不自动打开最近的项目
    unix网络编程之简介
    算法学习之函数
  • 原文地址:https://www.cnblogs.com/wyang0126/p/5039919.html
Copyright © 2011-2022 走看看