码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式学习之--策略模式

时间:2015-08-13 18:16:34      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:设计模式

          策略模式是什么:首先,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。说的有点不太容易理解,在我们面向对象的思想中一般都是结合我们的生活实例,举个现实的例子,我们的动物中有多种不同的鸟,它们都会飞行,都会走路,但它们的飞行方式不同,有些是翱翔,有些是燕子那样飞行,也有会像俯飞的(这个例子有点挫),但是鸟都会飞,它们的飞行策略是不同的,这里飞行就是不同的算法,或许很多不同的鸟会采用一种的飞行方式,也有的鸟不会飞行。这些策略就是不一样的算法。

  策略模式的实现
(1)通过分离变化得出策略接口strategy
(2)strategy的实现类
(3)客户程序中“有一个”strategy
(4)客户程序中选择组装正确的strategy实现,客户程序一般是我们的主要业务类


这里举一个制作不同鸭子的例子来说明一下怎么实现的:

鸭子的抽象类:

package com.imooc.pattern.strategy;

/*
 * 超类,所有的鸭子都要继承此类
 * 抽象了鸭子的行为:显示和鸣叫
 */
public abstract class Duck {
  
	/*
	 * 鸭子发出叫声
	 * 通用行为,由超类实现
	 */
	public void quack(){
		System.out.println("嘎嘎嘎");
	}
	
	/*
	 * 显示鸭子的外观
	 * 鸭子的外观各不相同,声明为abstract, 由子类实现
	 */
	public abstract void display();
	
	
	private FlyingStragety flyingStragety;//这个是策略stragety,不同的鸭子不同的飞行方式实现这个接口


	public void setFlyingStragety(FlyingStragety flyingStragety) {
		this.flyingStragety = flyingStragety;
	}
	
	public void fly(){
		flyingStragety.performFly();
	}
	
}
策略接口:

package com.imooc.pattern.strategy;
/*
 * 策略接口,实现鸭子的飞行行为
 */
public interface FlyingStragety {

	void performFly();
}
接下来我们定义不同的鸭子:

package com.imooc.pattern.strategy;

import com.imooc.pattern.strategy.impl.FlyWithWin;

//这个是一个普通飞行的鸭子

public class RedheadDuck extends Duck {

	public RedheadDuck(){
		super();
		super.setFlyingStragety(new FlyWithWin());//传入一个靠风飞行的算法实现
	}
	
	@Override
	public void display() {
		System.out.println("我的头是红色的");
	}

}



package com.imooc.pattern.strategy;

import com.imooc.pattern.strategy.impl.FlyWithRocket;
//这是一个会飞的用火箭飞的鸭子
public class SpaceDuck extends Duck {

	public SpaceDuck() {
		super();
		super.setFlyingStragety(new FlyWithRocket());//传入一个实现飞行接口的实现类定义飞行算法
	}

	@Override
	public void display() {
		System.out.println("我头戴宇航头盔");
	}
	
	public void quack(){
		System.out.println("我通过无线电与你通信");
	}

}
两个飞行策略的实现:

package com.imooc.pattern.strategy.impl;

import com.imooc.pattern.strategy.FlyingStragety;

public class FlyWithWin implements FlyingStragety {

	public void performFly() {
		System.out.println("振翅高飞");
	}

}

package com.imooc.pattern.strategy.impl;

import com.imooc.pattern.strategy.FlyingStragety;

public class FlyWithRocket implements FlyingStragety {

	public void performFly() {
		System.out.println("用火箭在太空遨游");
	}

}
下面是一个测试类,测试不同的飞行的鸭子:

package com.imooc.pattern.strategy;

public class DuckTest {

	public static void main(String[] args){
		System.out.println("测试鸭子程序");
		System.out.println("************************");
		Duck duck = null;
	        //duck = new RedheadDuck();
		duck = new SpaceDuck();
		
		duck.display();
		duck.quack();
		duck.fly();
		System.out.println("************************");
		System.out.println("测试完毕");
	}

}
这就是策略模式的案例,发现是更清晰了,以后不同的鸭子需要不同的功能,我们把这些类只是相关的行为不同的时候,且运行时选用不同的算法,就可以考虑使用我们的策略模式了。不然我们的类肯定会有许多判断语句,这个时候使用策略模式就好了。




    

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式学习之--策略模式

标签:设计模式

原文地址:http://blog.csdn.net/u010214269/article/details/47613027

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!