买的第一本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();
}
}
在书中学到的设计原则:
封装变化
多用组合,少用继承
分享到:
相关推荐
### 策略模式 Strategy Pattern #### 概述 策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法...
在策略模式中,有三个主要角色:策略接口(Strategy Interface)、具体策略类(Concrete Strategy Classes)和上下文(Context)。策略接口定义了所有支持的算法的公共接口,这样上下文就可以通过这个接口来调用这些...
策略模式的主要组成部分包括上下文(Context)、策略接口(Strategy Interface)和具体策略类(Concrete Strategy Classes)。上下文维护一个对策略对象的引用,并使用这个引用来调用策略对象的算法。策略接口定义了...
策略模式是一种设计模式,它使你能在运行时改变对象的行为,通过将算法封装在独立的策略类中,实现了策略的动态选择。这种模式的核心在于,它允许程序在不修改现有代码的情况下扩展功能,遵循“开闭原则”。...
策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在C#中,策略模式常用于处理具有多种实现方式的情况,使得代码更加灵活,易于扩展。下面将详细讲解策略模式的概念、用途以及如何...
工厂模式是一种常用的设计模式,它的主要目的是为了封装对象的创建过程,从而使得代码更加灵活,易于维护和扩展。在Head First设计模式中,工厂模式被用来解决对象创建时的“变化”问题,尤其是在需要根据条件动态...
**策略模式(Strategy Pattern)**是面向对象设计模式中的一种行为模式,它允许在运行时改变对象的行为。在Java编程中,策略模式被广泛应用于处理算法的可互换性问题,使得程序能够根据不同的环境或者需求选择合适的...
1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式...
备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...
5. **策略模式(Strategy Pattern)**: - 定义:定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。 - 应用场景:当应用程序需要根据不同情况执行不同的算法时,可以使用策略模式。 6. **适配器...
处理对象的多种状态及其相互转换——状态模式(五) 处理对象的多种状态及其相互转换——状态模式(六) 策略模式-Strategy Pattern 算法的封装与切换——策略模式(一) 算法的封装与切换——策略模式(二) 算法的...
策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate Pattern) 数据访问对象模式(Dao ...
创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4.... 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
2. **策略模式(Strategy Pattern)**: 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。它允许在运行时动态选择执行的算法,增强了系统的...
创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5.... 6. 适配器模式(Adapter ... 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) ...21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
创建型模式用来处理对象的创建过程,主要包含以下5种设计模式: 工厂方法模式(Factory Method ... 策略模式(Strategy Pattern) 模板方法模式(Template Method Pattern) 访问者模式(Visitor Pattern)
- **简化型模式**:如策略模式(Strategy Pattern),用于封装算法,使它们可以互相替换,从而让算法的变化独立于使用算法的客户。 6. **实践建议** - **逐步改进**:书中提倡采用小步骤的方式进行重构,逐步...
而`django-strategy-field`是Django生态中的一个实用库,它引入了策略模式(Strategy Pattern)的概念,为Django模型字段提供了灵活的行为管理。本文将深入探讨`django-strategy-field` 1.1.1版本的特性和使用方法。...