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

    策略模式

    定义:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

    问题:有一个鸭子类定义了鸭子的种种行为,包括swim(),quack(),fly(),但是,并不是所有的鸭子都会飞行(fly)或者叫(quack),在这里,我们认为所有的鸭子都会浮在水面上(swim)。如何实现各种不同的鸭子的不同的表现。

    解决方法:第一个想到的会使继承,在鸭子父类中定义好所有的方法,在实现鸭子子类的过程中,对不满足于具体的鸭子的行为进行覆盖,但是在这种方法中,首先的问题是代码需要在子类中重复的编写,而且运行时的行为不容易被改变等等。

    第二种方法会是接口,把fly()和quack()从鸭子类中提取出来。写成一个接口,能实现的鸭子实现接口,反之,则不实现接口,但是,这种方法会导致代码无法重复的利用。

    第三 策略模式,把鸭子类中可变的行为分别抽取出来,分别封装起来。

    见图:

      

    代码实现:

    Duck类:

    public abstract class Duck {
    	
    	FlyBehavior flyBehavior;
    	QuackBehavior quackBehavior;
    	
    	public abstract void display();
    	
    	public void swim(){
    		System.out.print(" swim ");
    	}
    
    	public void performFly() {
    		flyBehavior.fly();
    	}
    	
    	public void performQuack(){
    		quackBehavior.quack();
    	}
    	
    	public void setFlyBehavior(FlyBehavior fb){
    		this.flyBehavior = fb;
    	}
    	
    	public void setQuackBehavior(QuackBehavior qb){
    		this.quackBehavior = qb;
    		
    	}
    
    }
    

      fly接口及实现:

    public interface FlyBehavior {
    
    	public void fly();
    
    }
    
    
    
    public class FlyWithWings implements FlyBehavior {
    	
    	public void fly(){
    		System.out.print(" fly with wings ");
    	}
    
    }
    
    
    
    public class FlyNoWay implements FlyBehavior{
    	
    	public void fly(){
    		System.out.print(" cant't fly ");
    	}
    
    }
    

      quack接口及实现:

    public interface QuackBehavior {
    	
    	public void quack();
    
    }
    
    
    
    public class Quack implements QuackBehavior{
    	
    	public void quack(){
    		System.out.print(" quack");
    		
    	}
    	
    
    }
    
    
    
    public class BadQuack implements QuackBehavior{
    	
    	public void quack(){
    		
    		System.out.print(" cant't quack ");
    	}
    
    }
    

      测试:

    public class GreenDuck extends Duck{
    	
    	public GreenDuck(){
    		flyBehavior = new FlyWithWings();
    		quackBehavior = new Quack();
    	}
    
    	public void display() {
    		System.out.print(" real duck ");
    		
    	}
    }
    
    
    public class test {
    	
    	public static void main(String []args){
    		
    		Duck greenDuck = new GreenDuck();
    		greenDuck.performFly();
    		greenDuck.performQuack();
    		greenDuck.setFlyBehavior(new FlyNoWay());//动态改变鸭子的行为
    		System.out.println();
    		greenDuck.performFly();
    	}
    
    }
    

      结果:

    总结与分析(摘自http://blog.csdn.net/hguisu/article/details/7558249

    1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
    2)在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。
    3)策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。
  • 相关阅读:
    如何从GAC中拷贝文件出来
    寻找SPS2003的UI里文档或页面在数据库中的对应
    摸索WSS的service pack包的构成
    SharePoint Designer 2007可以打开SharePoint Portal Server 2003的站点么?
    什么是Query String
    升级SharePoint场的时候, 运行Configuration Wizard需要有什么顺序么?
    介绍一个免费的VS小插件 RockScroll
    记一次configuration wizard运行失败
    可以完成发送邮件功能的C#代码
    创建系统无法删除的文件夹 加密文件
  • 原文地址:https://www.cnblogs.com/zyqBlog/p/5287105.html
Copyright © 2011-2022 走看看