`
newbin
  • 浏览: 38593 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Strategy Pattern

阅读更多

买的第一本head first 系列的书---Head First Design Patterns 终于开始看了,今天看完了第一个模式:Strategy Pattern:定义的算法簇,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端.

     书中的例子挺经典的,看完这一章后,把书中的例子自己写了遍,练习了策略模式的使用,下面是代码:

鸭子类,有会飞,会叫等一系列行为:

package pro.pattern.strategy.example.duck;

import pro.pattern.strategy.example.duck.flybehavior.FlyBehavior;
import pro.pattern.strategy.example.duck.quackbehavior.QuackBehavior;

public abstract class Duck {
	FlyBehavior flyBehavior;
	
	QuackBehavior quackBehavior;
	
	public Duck(){
		
	}
	
	public abstract void display() ;
	
	public void performFly() {
		flyBehavior.fly();
	}
	
	public void performQuack(){
		quackBehavior.quack();
	}
	
	public void setFlyBehavior(FlyBehavior fly){
		flyBehavior = fly;
	}
	
	public void setQuackBehavior(QuackBehavior quack){
		quackBehavior = quack;
	}
}

 由于鸭子的种类很多(橡皮鸭,真鸭等,)其飞行,叫的行为不尽相同,可以将飞行和叫声分别定义为算法簇:

 飞行行为:

//封装飞行行为
package pro.pattern.strategy.example.duck.flybehavior;

public interface FlyBehavior {
	public void fly();
}


package pro.pattern.strategy.example.duck.flybehavior;

public class FlyNoWay implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println("I can't fly!");
	}

}


package pro.pattern.strategy.example.duck.flybehavior;

public class FlyWithWings implements FlyBehavior{

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

}

 

叫声行为:

package pro.pattern.strategy.example.duck.quackbehavior;

public interface QuackBehavior {

	public void quack();

}


package pro.pattern.strategy.example.duck.quackbehavior;

public class Quack implements QuackBehavior {

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

}


package pro.pattern.strategy.example.duck.quackbehavior;

public class MuteQuack implements QuackBehavior {

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

}


package pro.pattern.strategy.example.duck.quackbehavior;

public class Squack implements QuackBehavior {

	@Override
	public void quack() {
		System.out.println("Squack");
	}

}

 定义完算法簇后,就可以定义一个具体的鸭子(duck)类:

package pro.pattern.strategy.example.duck;

import pro.pattern.strategy.example.duck.flybehavior.FlyNoWay;
import pro.pattern.strategy.example.duck.quackbehavior.Squack;

public class ModelDuck extends Duck {

	@Override
	public void display() {
		System.out.println("Just a strategy pattern demo!");
	}
	
	public ModelDuck () {//用组合,不用继承
		flyBehavior = new FlyNoWay();
		
		quackBehavior = new Squack();
	}

}

 

测试:

package pro.pattern.strategy.example.duck;

import pro.pattern.strategy.example.duck.flybehavior.FlyWithWings;
import pro.pattern.strategy.example.duck.quackbehavior.MuteQuack;

public class Test {
	public static void main(String[] args){
		Duck duck = new ModelDuck();
		
		duck.performFly();
		duck.performQuack();
		//运行时动态设定行为
		duck.setFlyBehavior(new FlyWithWings());
		duck.setQuackBehavior(new MuteQuack());
		
		duck.performFly();
		duck.performQuack();
	}

}

  在书中学到的设计原则:

   封装变化

   多用组合,少用继承

1
0
分享到:
评论

相关推荐

    策略模式 Strategy Pattern

    ### 策略模式 Strategy Pattern #### 概述 策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法...

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

    在策略模式中,有三个主要角色:策略接口(Strategy Interface)、具体策略类(Concrete Strategy Classes)和上下文(Context)。策略接口定义了所有支持的算法的公共接口,这样上下文就可以通过这个接口来调用这些...

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

    策略模式的主要组成部分包括上下文(Context)、策略接口(Strategy Interface)和具体策略类(Concrete Strategy Classes)。上下文维护一个对策略对象的引用,并使用这个引用来调用策略对象的算法。策略接口定义了...

    前端大厂最新面试题-Strategy Pattern.docx

    策略模式是一种设计模式,它使你能在运行时改变对象的行为,通过将算法封装在独立的策略类中,实现了策略的动态选择。这种模式的核心在于,它允许程序在不修改现有代码的情况下扩展功能,遵循“开闭原则”。...

    C#策略模式(Strategy Pattern)实例教程

    策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在C#中,策略模式常用于处理具有多种实现方式的情况,使得代码更加灵活,易于扩展。下面将详细讲解策略模式的概念、用途以及如何...

    The Factory Pattern(工厂模式)ppt

    工厂模式是一种常用的设计模式,它的主要目的是为了封装对象的创建过程,从而使得代码更加灵活,易于维护和扩展。在Head First设计模式中,工厂模式被用来解决对象创建时的“变化”问题,尤其是在需要根据条件动态...

    Strategy 模式 JAVA

    **策略模式(Strategy Pattern)**是面向对象设计模式中的一种行为模式,它允许在运行时改变对象的行为。在Java编程中,策略模式被广泛应用于处理算法的可互换性问题,使得程序能够根据不同的环境或者需求选择合适的...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    Software Architecture Design Pattern In Java

    5. **策略模式(Strategy Pattern)**: - 定义:定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。 - 应用场景:当应用程序需要根据不同情况执行不同的算法时,可以使用策略模式。 6. **适配器...

    design-pattern-java.pdf

    处理对象的多种状态及其相互转换——状态模式(五) 处理对象的多种状态及其相互转换——状态模式(六) 策略模式-Strategy Pattern 算法的封装与切换——策略模式(一) 算法的封装与切换——策略模式(二) 算法的...

    用Java实现23种设计模式

    策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate Pattern) 数据访问对象模式(Dao ...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4.... 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    factory strategy builder iterator

    2. **策略模式(Strategy Pattern)**: 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。它允许在运行时动态选择执行的算法,增强了系统的...

    23种设计模式 (创建型,结构型,行为型)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5.... 6. 适配器模式(Adapter ... 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) ...21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    设计模式PPT

    创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:  工厂方法模式(Factory Method ... 策略模式(Strategy Pattern)  模板方法模式(Template Method Pattern)  访问者模式(Visitor Pattern)

    Refactoring-to-pattern

    - **简化型模式**:如策略模式(Strategy Pattern),用于封装算法,使它们可以互相替换,从而让算法的变化独立于使用算法的客户。 6. **实践建议** - **逐步改进**:书中提倡采用小步骤的方式进行重构,逐步...

    Python库 | django-strategy-field-1.1.1.tar.gz

    而`django-strategy-field`是Django生态中的一个实用库,它引入了策略模式(Strategy Pattern)的概念,为Django模型字段提供了灵活的行为管理。本文将深入探讨`django-strategy-field` 1.1.1版本的特性和使用方法。...

Global site tag (gtag.js) - Google Analytics