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

原创 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
	}






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

一 设计模式入门--策略模式 1.   先看一个小例子 ------------------- 父类:鸭  行为:【样子()】,【游泳()】,【呱呱叫()】   子类:绿头鸭,红头鸭   下面要做一...
  • lexluse
  • lexluse
  • 2016年09月09日 10:18
  • 118

【阅读】设计模式入门——策略模式

问题引入: 假设你有一堆鸭子对象,比如说绿头鸭、红头鸭,他们都继承了鸭子这个超类(内含一些鸭子的方法,比如说叫的方法、游泳的方法),这个时候我们要给所有的鸭子都加入一个飞行的方法和鸣叫方法我们应该怎么...

设计模式入门学习 策略模式

策略模式  Strategy:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使算法可以独立于使用它的客户而变化。   先来看一个简单的伪码示例: //抽象策略 clas...
  • omegayy
  • omegayy
  • 2012年02月02日 12:03
  • 526

设计模式入门之策略模式Strategy

//策略模式定义: //定义一些列算法,把他们一个个封装起来,并且使他们可互相交换。 //本模式使得算法可独立于使用它的客户而变化 //实例:对不同的客户给出不同的折扣价格,上代码 //策略接口 pu...

1. 策略模式:设计模式入门

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

设计模式入门一:策略模式

一.设计模式入门 1.设计原则    No.1找出应用中需要变化之处,把他们独立出来,不要和那些需要变化的代码混在一起    解释:把变化的部分取出来,并“封装”起来,好让其他部分不受到影响。 ...

设计模式-策略者

  • 2014年06月09日 13:27
  • 8KB
  • 下载

设计模式(14) 策略模式(简单入门 行为模式)

From Now On,Let us begin Design Patterns。策略模式 定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。 Define a family of...

策略设计模式简单代码实现

  • 2015年11月28日 16:25
  • 14KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式入门--策略设计模式
举报原因:
原因补充:

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