java设计模式--策略模式详解

目录
  • 策略模式
    • Demo
    • 代码:
  • 总结

策略模式

策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户。

  • 主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
  • 如何解决:将这些算法封装成一个一个的类,任意地替换。
  • 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

使用场景:

  • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  • 一个系统需要动态地在几种算法中选择一种。
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
优点 缺点
算法可以自由切换 策略类会增多
避免使用多重条件判断 所有策略类都需要对外暴露
扩展性良好

  • 环境类(Context):持有抽象策略类的引用,用来操作策略的上下文环境。
  • 抽象策略类(Strategy):策略的抽象类或接口,给出所需实现接口。
  • 具体策略类(ConcreteStrategy):具体的策略实现。

Demo

有几种鹅:天鹅、野鹅、灰鹅,鹅有各种行为,如飞、游泳、叫等。

假设天鹅灰鹅飞行能力一般,野鹅飞行能力优秀;天鹅野鹅游泳能力一般,灰鹅游泳能力优秀。

首先看第一种方法:

这种方法固然可以实现目的,但问题显而易见,子类过多覆盖父类方法,代码未复用,耦合度很高。使用策略模式,简单来说,就是封装子类行为成接口,父类包含该接口即可。

代码:

public interface FlyBehavior {
    void fly();
}
public class FlyGood implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞行能力优秀");
    }
}
public class FlyNormal implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞行能力一般");
    }
}
public interface SwimBehavior {
    void swim();
}
public class SwimGood implements SwimBehavior {
    @Override
    public void swim() {
        System.out.println("游得好");
    }
}
public class SwimNormal implements SwimBehavior {
    @Override
    public void swim() {
        System.out.println("游得一般");
    }
}
public abstract class Goose {
    //策略接口
    FlyBehavior flyBehavior;
    SwimBehavior swimBehavior;
    //其他属性等...
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
    public void setSwimBehavior(SwimBehavior swimBehavior) {
        this.swimBehavior = swimBehavior;
    }
}
public class Swan extends Goose{
    public Swan() {
        flyBehavior=new FlyNormal();
        swimBehavior=new SwimNormal();
    }
}
public class WildGoose extends Goose{
    public WildGoose() {
        flyBehavior=new FlyGood();
        swimBehavior=new SwimNormal();
    }
}
public class GreyGoose extends Goose{
    public GreyGoose() {
        flyBehavior=new FlyNormal();
        swimBehavior=new SwimGood();
    }
}
public class Client {
    public static void main(String[] args) {
        Swan swan=new Swan();
        swan.flyBehavior.fly();
        WildGoose wildGoose=new WildGoose();
        wildGoose.swimBehavior.swim();
        GreyGoose greyGoose=new GreyGoose();
        greyGoose.flyBehavior.fly();
        greyGoose.setFlyBehavior(new FlyGood()); //改变某个对象的行为
        greyGoose.flyBehavior.fly();
    }
}

运行结果:

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java设计模式之策略模式定义与用法详解

    本文实例讲述了Java策略模式定义与用法.分享给大家供大家参考,具体如下: 一. 定义: 定义一系列算法,把他们一个一个封装起来,并且使他们可以相互替换. 二. 优点: (1)上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系,因此上下文只需要知道他要使用某一个实现  Strategy接口类的实例,但不需要知道是哪个类. (2)策略模式满足开闭原则,当增加新的具体类时,不需要修改上下文类的代码,上下文即可以引用新的具体策略的实例. 三. 实例: 下面就通过一个问题

  • Java设计模式之策略模式原理与用法实例详解

    本文实例讲述了Java设计模式之策略模式原理与用法.分享给大家供大家参考,具体如下: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.其中JDK里面的TreeSet类和TreeMap类就用到了策略模式.这两个类是带排序的集合类,其中排序的规则就相当于策略模式里定义的一系列算法,而集合类就相当于是策略模式里的环境类,供用户使用,用只知道TreeSet和TreeMap是带排序的,至于怎么排序的,是由排序的算法决定的. 策略模式

  • 23种设计模式(11)java策略模式

    23种设计模式的学习视频已为大家备好,需要的可以在公众号内回复"设计模式"获取下载链接. 定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过的行为类模式中,有一种模式也是关注对算法的封装--模版方法模式.         对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别

  • Java通俗易懂系列设计模式之策略模式

    介绍 策略设计模式是行为设计模式之一.当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现. 策略模式的最佳示例之一是Collections.sort()采用Comparator参数的方法.基于Comparator接口的不同实现,对象将以不同的方式进行排序. 实例 对于我们的示例,我们将尝试实施一个简单的购物车,我们有两种付款策略 - 使用信用卡或使用PayPal. 首先,我们将为我们的策略模式示例创建接口,在我们的例子中,支付金额作为参数传递. 支付方式:Paymen

  • java设计模式学习之策略模式

    策略模式:策略模式是一种定义一系列算法的方法,算法完成的工作都是相同的工作,但是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合. Java实现一个策略模式: 需求:商场收银系统,收银方式为正常收费,打八折,满300返100,这三种收费方式. 1:创建一个超类.即收费的抽象方法. public abstract class CashSuper { public abstract double acceptCash(double money); } 2:创建实现此

  • java设计模式--策略模式详解

    目录 策略模式 Demo 代码: 总结 策略模式 策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户. 主要解决:在有多种算法相似的情况下,使用 if-else 所带来的复杂和难以维护. 如何解决:将这些算法封装成一个一个的类,任意地替换. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为. 使用场景: 如果在一个系统

  • java设计模式-组合模式详解

    目录 组合模式 Demo 代码: 总结 组合模式 组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构. 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 如何解决:树枝和叶子实现统一接口,树枝内部组合该接口. 何时使用:

  • java设计模式--原型模式详解

    目录 引例 原型模式 浅拷贝 在原先Sheep类基础上实现Cloneable接口,重写clone方法. 客户端调用 Sheep类 新添的Cow类 客户端调用克隆 深拷贝 1.Cow类也实现Cloneable接口 Sheep类的clone再添加调用cow的clone 客户端调用 1.Cow类实现序列化接口,不必实现Cloneable接口了 2.在Sheep类实现序列化接口 3.客户端调用 总结 引例 问题: 现在有一只羊(包含属性:名字Dolly.年龄2),需要克隆10只属性完全相同的羊. 一般解

  • java设计模式--桥接模式详解

    目录 引例 桥接模式 实战示例 代码: 总结 引例 需求:对不同手机类型的不同品牌(比如按键手机:诺基亚.翻盖手机:纽曼.智能手机:华为.小米)实现操作编程(比如: 开机.关机.打电话). 先来说说一般解法:将不同手机类型继承父类手机,最后各个品牌再继承对应手机类型: 弊端:乍一看没问题,但其实不易扩展(类爆炸),如果增加新的手机类型(比如新兴的折叠式),就需要增加各个手机品牌的类去继承(比如已继承智能手机的华为小米).同样如果我们增加一个手机品牌,也要在各个手机样式类下增加.违反了单一职责原则

  • java设计模式--建造者模式详解

    目录 引例 一般解法 代码: AbstractHouse(房子) Bungalow(平房) Villa (别墅) 客户端调用 建造者模式 建造者模式解法 代码: House类(Product产品) HouseBuilder类(Builder抽象建造者) 3.Bungalow类(ConcreteBuilder具体建造者A) 4.Villa类(ConcreteBuilder具体建造者B) 5.HouseDirector类(Director指挥者) 客户端调用 总结 引例 需求:建造房子,建造过程包括

  • java设计模式策略模式图文示例详解

    目录 策略模式 意图 问题 解决方案 真实世界类比 策略模式结构 伪代码 策略模式适合应用场景 实现方式 策略模式优缺点 策略模式优缺点 与其他模式的关系 策略模式 亦称:Strategy 意图 策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换. 问题 一天,你打算为游客们创建一款导游程序.该程序的核心功能是提供美观的地图,以帮助用户在任何城市中快速定位. 用户期待的程序新功能是自动路线规划:他们希望输入地址后就能在地图上看到前往目的

  • Java行为型设计模式之策略模式详解

    目录 1.策略设计模式定义 2.策略设计模式的有点与不足 3.策略设计模式的实现思路 4.代码示例 5.策略设计模式的应用场景 编程是一门艺术,大批量的改动显然是非常丑陋的做法,用心的琢磨写的代码让它变的更美观. 在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如超市促销可以釆用打折.送商品.送积分等方法. 在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有快速排序.归并排序.选

  • Java设计模式之模板方法详解

    目录 概念 核心设计要点 优缺点 应用场景 模板方法和策略模式的区别 代码案例 概念 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系.因此,在模板方法模式的类结构图中,只有继承关系. 核心设计要点 AbstractClass:抽象类,定义并实现一个模板方法.这个模板方法定义了算法的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类去实现. ConcreteClass:实现实现父类所定义的一个或多个抽象方法.. 优缺点 优点 利用模板方法将相同处理逻

  • Java之dao模式详解及代码示例

    什么是dao模式? DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作.在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中.用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法.在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储.DAO模式实

  • Java设计模式之装饰模式详解

    一.装饰模式引入例子 一个快餐店计算价格问题举例: 快餐店有炒面.炒饭这些快餐,可以额外附加鸡蛋.火腿.培根这些配菜,加配菜需要额外加钱,并且每个配菜的价钱不一样,计算快餐价格如何实现? 1.1 一般设计 1.2 使用继承方式的一般设计存在的问题 横向扩展性不好:如果要再加一种配料(火腿肠),我们就会发现需要给FriedRice和FriedNoodles分别定义一个子类.如果要新增一个快餐品类(炒河粉)的话,就需要定义更多的子,会出现类爆炸的问题. 继承适合于纵向扩展 二.装饰模式 2.1 装饰

随机推荐