设计模式入门--策略设计模式

原创 2015年07月08日 20:39:32

设计原则1 

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起。(变化的部分封装起来)

设计原则2

针对接口编程,而不是针对实现编程。

设计原则3

多用组合,少用继承


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

=================================

接口

//QuackBehavior接口

public interface QuackBehavior {
	public void quack();
}

//FlyBehavior接口

public interface FlyBehavior {
	public void fly();
}
接口实现类
public class FlyWithWings implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println("I am flying");
	}

}
public class Quack implements QuackBehavior {

	@Override
	public void quack() {
		System.out.println("<< Quack >>");
	}

}
父类

public abstract class Duck {
	// 1. 加入了两个实例变量
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	// 2. 实现相应的行为
	public void performQuack() {
		quackBehavior.quack();
	}

	public void performFly() {
		flyBehavior.fly();
	}

	public void swim() {
		System.out.println("All ducks can swim");
	}

	public abstract void display();

}

子类

public class MallarDuck extends Duck {

	/**
	 * 设计模式中讲到,针对接口编程,而不是针对实现编程。 此处的构造函数中却制造了一个具体实现类的实例
	 * 
	 * 在此处暂时先这么做,后面的有更多设计模式时候修正这一点
	 */
	public MallarDuck() {
		// 子类继承了Duck类,所以具有quackBehavior实例变量
		quackBehavior = new Quack(); // 制造了一个具体实例
		flyBehavior = new FlyWithWings();
	}

	public void display() {
		System.out.println("I am a Mallard duck");
	}
}
测试类

public class DuckTest {
	public static void main(String[] args) {

		Duck duck = new MallarDuck(); // 多态性
		duck.performFly();
		duck.performQuack();
		duck.display();
		duck.swim();
	}
	//结果
	/**
	 * I am flying
	 * << Quack >>
	 * I am a Mallard duck
	 * All ducks can swim
	 */
}

动态的设定行为

// 在Duck类中加入两个新方法
	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}

	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}
制造一个新的Duck类型

public class ModelDuck extends Duck {

	public ModelDuck() {
		flyBehavior = new FlyNoWay(); // 此处没有会飞的行为
		quackBehavior = new Quack();
	}

	@Override
	public void display() {
		System.out.println("I am a model Duck");
	}

}
建立一个新的Fly行为

public class FlyRocketPowered implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println("I am flying with a rocket");
	}

}
改变行为

private static void modelDuckTest() {
		Duck model = new ModelDuck();
		model.performFly(); // I cann't fly
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly(); // I am flying with a rocket
	}






java设计模式之二:策略模式

策略模式与简单工厂模式原理上有许多相似的地方,都是利用java的继承和多态实现。在这里贴上代码: 抽象父类: public abstract class Operation { protected d...
  • zyq1013906061
  • zyq1013906061
  • 2017年07月10日 09:48
  • 82

设计模式系列之六:策略模式

前言策略模式是设计模式中的行为型模式,所谓行为型就是其主要使用在方法有很大灵活性的情况。而之前的工厂模式主要是对创建对象的优化,减少程序中使用new对象的次数。策略模式在Java源码中也是很常见的,比...
  • u011116672
  • u011116672
  • 2016年03月27日 21:57
  • 587

JAVA设计模式之:策略模式

策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 策略模式一般由下面三部分组成: 1. ...
  • true100
  • true100
  • 2015年12月16日 15:23
  • 961

设计模式入门-策略设计模式

本人学习的第一个模式-策略设计模式    不做定义   跟着headFirst  一起思考思考,一个模拟鸭子的鸭子的游戏 ,有各种不同的鸭子,鸭子的行为有:游泳 ·叫 ·飞等等   ,我们 的第一反应...
  • hechun19901104
  • hechun19901104
  • 2017年01月04日 19:52
  • 87

C++设计模式<四>:策略模式(Strategy)

1.动机在软件构件过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。2.模式定义定义一系列算法,把它们...
  • MonroeD
  • MonroeD
  • 2016年04月08日 01:16
  • 398

设计模式在Android中的应用

详情:http://www.cnblogs.com/qianxudetianxia/tag/Android设计模式系列/ 一直不清楚在Android中使用了哪些设计模式,今天看到了以为大神的博客,...
  • liuyi1207164339
  • liuyi1207164339
  • 2016年03月11日 23:12
  • 641

设计模式C++实现——策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。         策略模式UML图如下:           举例:         游泳池中有不...
  • walkerkalr
  • walkerkalr
  • 2014年06月04日 15:32
  • 1385

【设计模式】策略设计模式

假设今天老婆让我去丈母娘家做客,可是我答应了我的情人晚上要回去陪她,这可怎么办?,,正在我纠结的时候,好哥们给我一个三个理由包,让我不要看,到时候看情况拆开接口三个妙计是同一个类型,继承同一个接口/*...
  • ttf1993
  • ttf1993
  • 2015年05月14日 17:51
  • 453

设计模式之策略模式(python实现)

最近在读《深入浅出设计模式》这一本书,收获颇多,打算写一个系列的blog,并用python实现其中的每一个设计模式,以加深理解。              下面将要介绍的就是书中的第一个设计模式...
  • huangkangying
  • huangkangying
  • 2012年08月10日 23:19
  • 4925

设计模式:策略模式(Python)

策略模式(Strategy Pattern): 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 原则: 针对接口(...
  • ericzhong83
  • ericzhong83
  • 2012年05月17日 23:53
  • 4904
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式入门--策略设计模式
举报原因:
原因补充:

(最多只允许输入30个字)