实例说明策略模式

最近工作不是很多,正好抽出时间学习一下期待已经的设计模式,作为一名刚毕业一年的开发人员更应该多抽出些时间了解一下设计模式。

此片文章对策略模式做一个总结,希望对大家有帮助。

(题外话:策略模式之前只是看定义和一些简单的例子,根本不明白,最后一头雾水,不过下面这个小例子还挺有趣的哦,能很好的理解到底什么是策略模式。)

一.案例

设计一个动作冒险类游戏,游戏大概是这样的:游戏中有不同的角色,每个角色战斗时使用的武器不同。现有两个角色:骑士(Knight)和巨魔头(Troll),Knight的武器是宝剑(Sword),巨魔头的武器是斧头(Axe);作战规则,先确定身份,使用武器作战,最后停止作战。

1.分析:

Knight和Troll都是角色,所以可以定义一个超类Character;

确定角色身份,使用武器,作战,停止作战都作为Character类具有的方法:

(1)每个角色的身份,使用武器作战的方式不同,所以在Character中定义为抽象方法(abstract),在子类Knight和Troll中具体实现;

(2)而停止作战就是一个停止动作,所以直接在character中实现由子类继承即可。

2.按照如上分析代码实现(体现了基本的OO设计原则:继承、抽象):

角色类(超类):

    public abstract class Character {    
    
        public abstract void identify();
        
        public abstract void fight();
        
        public void stopFight(){
            System.out.println("Hi,stop fight and go to sleep,now");
        }
    }

骑士类(子类):

    public class Knight extends Character{

        //实现父类的接口
        public void identify() {
            System.out.println("Hi,everybody,I am a handsome Knight");
        }
    
        //实现父类的接口
        public void fight() {
            System.out.println("I fight with Sword the King give me");
        }

    }

巨魔头类(子类):

    public class Troll extends Character{    
    
        public void identify() {
            System.out.println("I am a Troll,I want to control the entire universe");
        }
    
        public void fight() {
            System.out.println("My axe never relented");
        }
    
    }

3.总结:

此时的程序设计已经满足了OO设计中的继承和抽象原则,但是设想一下,如果后期需要添加更过的角色,每个角色使用的武器都不相同,或者需要更改原来的角色使用的武器;设置要求某些角色可以在运行中更换武器,这样,程序的维护性就增加了困难。

4.重新分析:

对于每个角色来说,使用不同的武器来作战属于一种行为,以上设计实现的方式是角色类自己去执行自己的行为,这样导致,多种角色时,代码冗余不好控制,没有独立性。

不如我们把变化的行为拿出来单独封装在指定的类中,以接口的形式定义,在每个角色类中实现并处理执行相应的行为。这样可以使得后期变化的东西不会改变其他不变的。

5.按照如上分析,给出整理代码(体现了OO设计中的封装和多态):

角色类(超类):

    public abstract class Character {    
        //使用WeaponBehavior类
        protected WeaponBehavior weaponBehavior;
    
        //构造方法
        public Character(){
            
        }
        
        //定义fight方法,委托WeaponBehavior类对象做对应的事情
        public void fight(){
            weaponBehavior.useWeanpon();
        }
        
        //抽象方法,子类实现
        public abstract void identify();
        
        //父类方法,子类直接使用
        public void stopFight(){
            System.out.println("Hi,stop fight and go to sleep,now");
        }
    
        //设置方式,可以在运行过程中更改某个角色的使用武器
        public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
            this.weaponBehavior = weaponBehavior;
        }
    }

子类--骑士类:

    public class Knight extends Character{    
        
        //构造方法,创建使用的武器对象
        public Knight(){
            //骑士使用的是宝剑
            weaponBehavior = new Sword();
        }
    
        //实现父类的接口
        public void identify() {
            System.out.println("Hi,everybody,I am a handsome Knight");
        }
    
    }

子类--巨魔头类:

    public class Troll extends Character{    
        
        //构造方法,创建使用的武器对象
        public Troll(){
            //巨魔头使用的是宝斧头
            weaponBehavior = new Axe();
        }
    
        public void identify() {
            System.out.println("I am a Troll,I want to control the entire universe");
        }
    
    }

分离出的行为定义的抽象类:

    public interface WeaponBehavior {    
        public void useWeanpon();
    }

行为抽象类的实现类之一--使用宝剑的实现类:

    public class Sword  implements WeaponBehavior{    
    
        public void useWeanpon() {
            System.out.println("Sword");
        }
    }

行为抽象类的实现类之二--使用斧头的实现类:

    public class Axe  implements WeaponBehavior{    
    
        public void useWeanpon() {
            System.out.println("Axe");        
        }
    }

行为抽象类的实现类之三--新增的弓箭实现类:

    public class BowAndArrow implements WeaponBehavior{    
    
        public void useWeanpon() {
            System.out.println("Bow and Arrow");        
        }
    
    }

主方法调用测试:

        //创建角色对象--多态
        Character king = new King();
        king.identify();
        //委托
        king.fight();
        king.stopFight();
        
        //创建角色对象--多态
        Character knight = new Knight();
        knight.identify();
        //委托
        knight.fight();
        knight.stopFight();
        //改变行为
        knight.setWeaponBehavior(new BowAndArrow());
        knight.fight();
        knight.stopFight();

执行结果:

    国王:        
        I am the king of all
        Sword
        Hi,stop fight and go to sleep,now
        
    骑士:
        Hi,everybody,I am a handsome Knight
        Sword
        Hi,stop fight and go to sleep,now
        Bow and Arrow
        Hi,stop fight and go to sleep,now

二.关于观察者模式结合例子的总结

1.每一个角色都有一个WeaponBehavior并委托他们做使用不同武器作战行为--其实这
       就是UML中的组合(composition)关系,即将两个结合起来使用。
    2.角色的行为被封装到一组类中,并可以被轻易额扩充和改变,甚至可以在运行时改变行为。
    3.体现的OO的封装(可变的一组行为的封装成类)、抽象、继承、多态;

三.例子中体现的OO设计中一些设计原则

设计原则:
    1.封装变化:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起;
    (1)把会变化的部分“封装”起来,好让其他不需要变化的部分不会收到变化部分的影响;
    (2)好处:使得由于代码变化导致的不经意后果变少,系统变得更加有弹性;
    2.针对接口编程,不针对实现编程;
    (1)针对接口编程真正的意思是,针对超类型(supertype)编程;
    (2)关键点:利用多态;
    (3)某个类将一些可变的行为动作“委托(delegate)”别的类处理,而非定义在本类或子类中。
    3.多用组合,少用继承;
    (1)使用组合优点:使系统有更大的弹性,不仅可以将算法族(一组行为)封装成类,并且可以
         做到在运行时动态额改变行为(算法);

四.本文重点--策略模式的定义:

**第一个设计模式:策略模式(Strategy pattern)
    正式定义:
    策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
    
    学习设计模式的优势:
    1.可以使你思考架构的层次提高到模式层次,而不仅仅停留在琐碎的对象上。
    2.模式能够让你用更少的词汇做更充分的沟通;
    3.要想建立可维护的OO系统,要诀就在于随时想到系统系统以后可能需要的变化以及应付变化的原则。

时间: 2024-12-31 22:10:17

实例说明策略模式的相关文章

设计模式之策略模式(行为型)

一.模式定义 策略模式:定义一系列算法,然后将每一个算法封装起来,并将它们可以互相替换.也就是将一系列算法封装到一系列策略类里面.策略模式是一种对象行为型模式.策略模式符合"开闭原则" Strategy Pattern: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently fro

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

Java 策略模式

Java 策略模式 @author ixenos 定义 1.封装算法:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换 2.分割行为和环境:对用户屏蔽内部实现,使客户端在调用算法的时候能够互不影响地互换 策略模式的实现(面向接口编程) 方法: 1.接口多态:策略模式的用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使他们之间可以相互替换 2.具体策略提供不同算法,环境负责维持和查询策略,把具体策略和环境分割开来,使得算法可以在不影响客户端和环境的情况下修改 角色分工:

PHP设计模式——策略模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法. 适用场景: 1. 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. 2. 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现. 3. 对客户隐藏具体策略(算法)的实现细节,彼此完全独立. 4.客户端必须知道所有的策略类,并自行决定使

设计模式入门-策略模式&amp;观察者模式

策略模式-strategy mod1:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起: 不同鸭子类型的飞行行为.鸣叫行为,会有不同的实现,可独立出来,和其他区分--区分变化的和不会变化的部分. mod2:针对接口编程,而不是针对实现编程: 鸭子子类使用接口表示行为,所以具体的实现不会绑死在鸭子的子类中,且可以在运行时改变行为. mod3:多用组合,少用继承: '有一个'比'是一个'更好,鸭子的具体行为可以委托给具体的行为类去处理,使用组合建立的系统有很大的弹性,不

设计模式(一)策略模式

1.什么是策略模式? 策略模式,又叫算法簇模式,就是定义了不同的算法簇,并且之间可以互相替换,此模式算法的变化独立于使用算法的客户. 2.策略模式有什么好处? 策略模式的好处在于你可以动态改变对象的行为. 3.设计原则 设计原则是把一个类中经常改变或者将来改变的部分提取出来,作为一个接口(C++中可以用抽象类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现这个接口的类的行为. 策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口(C++中即为抽象基

设计模式(一):策略模式

一.设计背景 现实生活中,我们要做一件事情或者完成某项工作,往往有很多种途径.比如我们出游,可以选择坐汽车,坐火车,土豪点的选择是坐飞机.还有我们现在线下的支付方式也有了很多种选择,以前在外面忘了带钱的话可能一瓶水都难以买到,现在只要我们手机在身上,可以用微信或者支付宝. 在软件设计层面,我们把各种支付方式叫做策略.如果不考虑设计模式的话,我们可能会在一个类中用if..else方式来选择支付方式,即 if(type == 1){ //微信支付 }else if(type == 2){ // 支付

【设计模式】策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为.

策略模式和php实现

策略模式: 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换.策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 策略模式是一种对象行为型模式. 模式动机: 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务. 在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的