`

设计模式总结之策略模式 (Strategy)

阅读更多

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

下面以鸭子为例实现策略模式

package com.licong.strategy;

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


	public void setFlyingStragety(FlyingStragety flyingStragety) {
		this.flyingStragety = flyingStragety;
	}
	
	public void fly(){
		flyingStragety.performFly();
	}
	
}

 

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

	void performFly();
}

 红头鸭实体类

package com.licong.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.licong.strategy;

import com.imooc.pattern.strategy.impl.FlyNoWay;
/**
 * 大黄鸭
 *
 */
public class RubberDuck extends Duck {

	public RubberDuck() {
		super();
		super.setFlyingStragety(new FlyNoWay());
	}

	@Override
	public void display() {
		System.out.println("我全身发黄,嘴巴很红");
	}
	
	
	public void quack(){
		System.out.println("嘎~嘎~嘎~");
	}

}

 飞行策略(不会飞)

package com.licong.strategy.impl;

import com.imooc.pattern.strategy.FlyingStragety;

public class FlyNoWay implements FlyingStragety {

	public void performFly() {
		System.out.println("我不会飞行!");
	}

}

 飞行策略(使用翅膀飞)

package com.licong.strategy.impl;

import com.imooc.pattern.strategy.FlyingStragety;

public class FlyWithWin implements FlyingStragety {

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

}

 

package com.licong.strategy;

public class DuckTest {

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

}

 优点:

1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
分享到:
评论

相关推荐

    走进设计模式之 策略模式(Strategy)

    总结一下,策略模式是一种将算法家族封装起来,使其互不影响的设计模式。它提供了一种方式,让算法的变化独立于使用算法的客户。在`Strategy.cpp`、`main.cpp`、`Context.cpp`、`Strategy.h`、`Context.h`等文件中,...

    设计模式之策略模式(Strategy Pattern)

    总结来说,策略模式是一种强大的设计模式,它提供了管理可互换算法的结构,使代码更具可扩展性和可维护性。在面对需要根据条件选择不同行为的场景时,策略模式通常是一个优秀的解决方案。通过理解并熟练应用策略模式...

    设计模式C++学习之策略模式(Strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式通常通过定义一系列算法类并让它们之间可以互换来实现。这些算法类都实现了一个公共接口,使得它们可以被相同的客户端代码调用,而...

    设计模式之策略模式 鸭子问题

    设计模式之策略模式 鸭子问题 策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和实现。策略模式的主要思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。...

    (行为型模式) Strategy 策略模式

    C#面向对象设计模式 (行为型模式) Strategy 策略模式 视频讲座下载

    设计模式之策略模式(Strategy Pattern)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,我们经常遇到需要在不同时间或根据不同条件使用不同算法的情况。策略模式允许我们将算法封装到独立的可互换的策略类中,从而使它们可以...

    C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C#中,策略模式经常被用来解决复杂的问题,特别是在需要动态切换算法或行为的场景下。它通过将算法封装到具有独立接口的类中,使得算法可以互相替换...

    策略(strategy)模式

    总结来说,策略模式是一种强大的设计模式,它允许我们在不修改现有代码的情况下,通过引入新的策略类来扩展系统功能。通过封装不同的策略,策略模式提高了代码的可重用性和可扩展性,降低了系统的耦合度。在软件开发...

    【Java设计模式】(2)策略模式Strategy

    总结来说,策略模式是一种强大的设计模式,它提供了一种将算法族封装在独立的可互换的策略类中的方法,使得客户端可以根据需要选择合适的行为。在Java编程中,策略模式广泛应用于需要动态改变对象行为的场景,如游戏...

    设计模式之策略(Strategy)模式

    这份文档讲诉了设计模式之策略(Strategy)模式,希望可以帮助学习的人!

    设计模式-策略模式(Strategy)

    总结来说,策略模式是一种强大的设计模式,它使得程序能够灵活应对多变的需求,通过策略的动态选择,提高了代码的可读性和可维护性。在处理具有多种行为选择的场景时,策略模式是一种非常实用的设计工具。

    [行为模式] head first 设计模式之策略模式(strategy)

    策略模式通常由三部分组成:上下文(Context)、策略接口(Strategy)和具体策略类(Concrete Strategy)。上下文是使用策略的对象,它定义了与策略交互的接口,而策略接口定义了策略的公共操作。具体策略类实现了...

    Java 设计模式-策略模式(Strategy)Android讲解

    总结来说,策略模式在Java和Android开发中是一种非常实用的设计模式,它通过封装不同的策略,使程序能够根据需要在运行时灵活选择和切换算法,提高了代码的灵活性和可扩展性。理解和掌握策略模式对于提升Android开发...

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    总结来说,李建忠先生的“设计模式总结”涵盖了C#中广泛使用的设计模式,强调了它们在实际项目中的应用价值。理解并熟练运用这些模式,对于提升C#开发者的专业素养和项目质量具有重大意义。无论是初学者还是经验丰富...

    JAVA设计模式demo之策略模式

    在这个"JAVA设计模式demo之策略模式"的示例中,你可能会看到以下的代码结构: 1. **策略接口**:`Strategy.java` ```java public interface Strategy { void execute(); } ``` 这个接口定义了一个通用的行为...

    设计模式--策略模式java例子

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常用于替换硬编码的条件语句,使代码更加灵活、可扩展和易于维护。下面我们将详细探讨策略模式的核心概念、实现方式以及在实际...

    设计模式 之 “策略模式[Strategy Pattern]”

    在策略模式中,核心概念包括上下文(Context)、策略(Strategy)和具体策略(Concrete Strategy)。上下文是使用策略的对象,它维护一个对策略的引用,并通过这个引用调用策略的接口来执行策略。策略是一个接口或者抽象类...

Global site tag (gtag.js) - Google Analytics