23种设计模式之策略设计模式

策略模式:分别封装行为接口,实现算法组,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。

策略模式注意点:1)分析项目中变化部分与不变部分;2)多用组合少用继承;用行为类组合,而不是行为的继承更有弹性。

鸭子游戏项目设计思路

一般设计是分析鸭子类别,把相同的放在抽象超类中实现,不同的在抽象超类中定义为抽象方法,然后不同的鸭子继承抽象超类,实现抽象方法

public abstract class Duck {

    public Duck() {

    }

    //鸭子都是一样的叫声
    public void quack() {
        System.out.println("~~gaga~~");
    }

    //鸭子都会游泳
    public void swim() {
        System.out.println("~~im swim~~");
    }

    //鸭子长相不一样
    public abstract void display();

}

abstract duck

public class RedHeadDuck extends Duck {
    public void display() {
        System.out.println("**RedHead**");
    }
}

RedHeadDuck extends duck

public class GreenHeadDuck extends Duck {
    public void display() {
        System.out.println("**GreenHead**");
    }
}

GreenHeadDuck

现在需求要改,鸭子会飞,那就给抽象超类添加一个fly方法,并实现会飞功能

public abstract class Duck {

    public Duck() {

    }

    //鸭子都是一样的叫声
    public void quack() {
        System.out.println("~~gaga~~");
    }

    //鸭子都会游泳
    public void swim() {
        System.out.println("~~im swim~~");
    }

    //鸭子长相不一样
    public abstract void display();

    //鸭子都会飞
    public void fly() {
        System.out.println("~~fly~~");
    }

}

超类添加鸭子会飞方法

然后又改需求,说GreenHeadDuck不能飞了,那就要在GreenHeadDuck中覆盖父类fly方法

@Override
    public void fly() {
        System.out.println("**im cant fly**");
    }

greenduck重写父类fly方法

现在问题来了,就是在父类中实现了一个方法,如果有多个子类跟父类方法不一致,那就要每个不一致的子类都要重写父类方法;如果把超类中fly定义成抽象的,那么相同fly的代码不能重用了,使用和维护上麻烦了

又有个需求,stone duck既不会飞也不会叫,那么子类中要把fly和quack重写;所以父类挖坑要子类来填,这种设计并不是好的设计

项目设计方法:分析项目变化部分和不变部分,提取变化部分,抽象成接口+实现

以鸭子游戏项目为例,假如分析得出鸭子quack和fly是变化的

根据策略模式,把变化的行为抽象成接口,flybehavior和quackbehavior

超类中定义接口对象,接口对象调用相应方法,子类只对接口对象做对应的实例化即可

public interface FlyBehavior {

    void fly();

}

行为接口FlyBehavior

public interface QuackBehavior {

    void quack();

}

行为接口QuackBehavior

public class GoodFlyBehavior implements FlyBehavior {
    public void fly() {
        System.out.println("~~good fly~~");
    }
}

FlyBehavior实现

public class GaGaQuackBehavior implements QuackBehavior {
    public void quack() {
        System.out.println("~~ga ga ~~");
    }
}

QuackBehavior实现

public abstract class Duck {

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck() {

    }

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

    public void quack() {
        quackBehavior.quack();
    }

    public abstract void display();

    public void swim() {
        System.out.println("~~swimming~~");
    }

}

抽象超类,定义了接口对象

public class GreenHeadDuck extends Duck {

    public GreenHeadDuck(){
        this.flyBehavior=new GoodFlyBehavior();
        this.quackBehavior=new GaGaQuackBehavior();
    }

    public void display() {
        System.out.println("**GreenHead**");
    }
}

子类根据自己的行为设定行为对象

同样RedHeadDuck也可以像GreenHeadDuck一样,在自己的类中设定行为对象

这样有点问题就是一旦子类定义好,就不能动态改变行为了,那么就在超类中定义接口对象的set方法,可以使新实例化后的子类设定新的行为对象

时间: 2024-10-10 17:29:27

23种设计模式之策略设计模式的相关文章

设计模式之策略设计模式

一.何为策略设计模式呢? 在我的理解中,策略模式是尽量使用组合而非继承来实现一个行为,对一个方法的进行封装来使用,在组合类中进行调用时能够随时改变这一方法的运行时的内容.下面让我们来看看将一个实现改成策略模式后的便捷性. 二.一个简单的示例 假设我们有一个抽象的人,他拥有会踢球跟会乐器的技能,然后有一个只会踢球不会乐器的人继承了这个抽象的人类,还有一个只会乐器不会踢球的人继承了这个抽象的人类. 1 abstract class People{ 2 abstract void playBall()

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

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为. 如何解决:将这些算法封装成一个一个的类,任意地替换. 关键代码:实现同一个接口. 应用实例: 1.诸葛亮的锦囊妙计,每一个锦囊就是一个策略. 2.旅行的出游方式,选择骑自行车.坐汽车,每一种旅行方式都是一个策略. 3.JAVA AWT 中的 LayoutManager. 优

设计模式之------策略设计模式

<?php /** **策略模式:定义一系列算法,使他们可相互替换,并且算法的改变不影响使用他们的客户 *******/ interface strategy{ public function filter(); } class User implements strategy{ public function filter(){ echo 'user filter'; } }   class Enery implements strategy{ public function filter()

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

假设今天老婆让我去丈母娘家做客,可是我答应了我的情人晚上要回去陪她,这可怎么办?,,正在我纠结的时候,好哥们给我一个三个理由包,让我不要看,到时候看情况拆开 接口 三个妙计是同一个类型,继承同一个接口 /** * 声明一个接口 * @author TTF * */ public interface JieKou { public void reson(); } 三个理由类 喝酒时候的理由 public class HeJiu implements JieKou { @Override publi

Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

23种设计模式【转】

23种设计模式 目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Singleton(单例) 结构型 6. Adapter Class/Object(适配器) 7. Bridge(桥接) 8. Composite(组合) 9. Decorator(装饰) 10. Facade(外观) 11. Flyweight(享元) 12. Proxy(代理) 行为型 13.

简述23种软件设计模式

简述23种软件设计模式 一.设计模式分类 总体来说设计模式分为三大类: 五种创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 七种结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 十一种行为型模式:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式概述 创建型模式 1.工厂方法模式 工厂方法模式的创建是因为简单工厂模式有一个问题,在简单工厂模式

0. Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

23种设计模式全解析

一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 其实还有两类:并发型模式和线程池模式.用一个图片来整体描述一下: 二.设计模式的六大原则 总原则:开闭原则(Open C