设计模式之策略设计模式

一、何为策略设计模式呢?

  在我的理解中,策略模式是尽量使用组合而非继承来实现一个行为,对一个方法的进行封装来使用,在组合类中进行调用时能够随时改变这一方法的运行时的内容。下面让我们来看看将一个实现改成策略模式后的便捷性。

二、一个简单的示例

  假设我们有一个抽象的人,他拥有会踢球跟会乐器的技能,然后有一个只会踢球不会乐器的人继承了这个抽象的人类,还有一个只会乐器不会踢球的人继承了这个抽象的人类。

 1     abstract class People{
 2         abstract void playBall();
 3         abstract void playInstrument();
 4     }
 5
 6     /**
 7      * 一个只会乐器的人 9      *
10      */
11     class InstrumentPeople extends People{
12
13         @Override
14         void playBall() {
15
16         }
17
18         @Override
19         void playInstrument() {
20             System.out.println(" I can play piano");
21         }
22
23     }
24
25     /**
26      * 一个只会打球的人28      *
29      */
30     class PysicalPeople extends People{
31
32         @Override
33         void playBall() {
34             System.out.println("I can play basketBall");
35         }
36
37         @Override
38         void playInstrument() {
39
40         }
41
42     }

  在继承的模式中我们只能必须实现那个不能完成的方法,那个方法已然成为了一个冗余的空壳方法。

当我们把实现的方式改成策略设计模式

     /**
     * 一个只会打球的人
     *
     */
    class PysicalPeople{
        private PlayBall playBall;

        public void setPlayBall(PlayBall playBall) {
            this.playBall = playBall;
        }

        public void playBall(){
            this.playBall.play();
        }

    }

    /**
     * 一个只会乐器的人
     *
     */
    class InstrumentPeople{

        private PlayInstrument playInstrument;

        public void setPlayInstrument(PlayInstrument playInstrument) {
            this.playInstrument = playInstrument;
        }

        public void palyInstrument(){
            this.playInstrument.play();
        }

    }

    interface PlayBall{
        void play();
    }

    class PlayBasketBall implements PlayBall{

        public void play() {
            System.out.println("I can play basketball");
        }

    }

    interface PlayInstrument{
        void play();
    }

    class PlayPiano implements PlayInstrument{

        public void play() {
            System.out.println("I can play piano");
    }
        

  我们在策略模式中将方法表现为一个类,在不同的人类中通过组合来实现不同的技能,实现方式改为策略设计模式之后,我们可以很容易的让一个类去拥有某一个方法,而不会存在冗余的方法。当我们需要需要PysicalPeople会踢足球时,只需要继承playBall接口实现一个PlayFootBal类,通过setPlayBall方法将PlayFootBall对象设置到PysicalPeople中就可以很方便的实现方法内部的实现,而不用修改类内部的代码。

  策略设计模式也体现了面向设计模式的一个原则:多用组合,少用继承。

时间: 2024-10-25 14:04:55

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

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

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

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

策略模式:分别封装行为接口,实现算法组,超类里放行为接口对象,在子类里具体设定行为对象.原则就是:分离变化部分,封装接口,基于接口编程各种功能.此模式让行为算法的变化独立于算法的使用者. 策略模式注意点:1)分析项目中变化部分与不变部分:2)多用组合少用继承:用行为类组合,而不是行为的继承更有弹性. 鸭子游戏项目设计思路 一般设计是分析鸭子类别,把相同的放在抽象超类中实现,不同的在抽象超类中定义为抽象方法,然后不同的鸭子继承抽象超类,实现抽象方法 public abstract class Du

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

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

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

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

【设计模式】Java设计模式第零课之策略模式

从今天开始看<<Head First 设计模式>>,打算每学习一章都写一篇笔记,今天的第零篇希望是一个好的开端,能够善始善终.加油. 设计模式入门:策略模式(看实际的需求(情景)是什么,采用适当的策略) 设计原则零:不管当初软件设计的多好,一段时间之后总是成长和改变的,否则软件就会死亡. 设计原则一:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起 把会变化的部分取出并封装起来,好让其他部分不会受到影响 这样代码引起的不经意后果变少,系统变得更有弹性

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

接口的常用用法都有什么?策略设计模式复习总结

从之前的一个总结性话题引出: 从接口.抽象类到工厂模式再到JVM来总结一些问题 涉及的知识点总结如下: 策略模式概念和例子 工厂模式和策略模式比较 策略模式优缺点 策略模式的意义 使用了策略模式的API——HttpServlet类分析 解决策略膨胀问题——享元模式 StrategyPattern:策略模式也算比较简单的,同工厂模式一样都属于面向接口编程……策略模式是对象的行为模式之一,而工厂模式是对象的创建模式!它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口

Head First 设计模式之一 策略模式

策略模式 定义 策略模式定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户. 实例 上面的定义看起来说的不太清楚,记定义无意义,理解策略模式还是要看书中的鸭子例子.假设设计一个模拟鸭子的游戏,鸭子的种类有很多,有红头鸭.绿头鸭等等,鸭子可以划水,可以呱嘎叫.在这个模拟游戏的实现上,自然会想到用继承的方法,定义一个鸭子基类,具体的鸭子类型继承自鸭子基类.如下图所示 所有鸭子都会飞.呱呱叫和游泳,这些功能由基类来实现,display函数用来输出鸭子实例的类型,

策略设计模式理解

我们开发过程中,常因为一开始的架构不怎么合理而有可能造成后边客户或者项目经理改需求时,造成我们需要修改原来的代码,一方面是可能写的时间久了回顾起来麻烦,另一方面是牵一发而动全身,改动一个地方造成所有的地方都需要改动,由此可见一个好的架构是多么重要.那么今天给大家讲一种策略设计模式来定义一个利于扩展的框架. 简单举个例子,我们开发一款游戏如果有需要定义一个角色,有武器攻击,有武器防御,那我们可能会觉得很简单,然后一开始定义就直接定义一个父类,再加一个子类实现,代码如下: abstract clas