首页 > 其他分享 >策略模式

策略模式

时间:2023-08-06 16:02:26浏览次数:29  
标签:策略 useWeapon void 模式 fight class static public

If you can NOT explain it simply, you do NOT understand it well enough

**介绍:**定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

**主要解决:**在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

**何时使用:**一个系统有许多许多类,而区分它们的只是他们直接的行为。

**如何解决:**将这些算法封装成一个一个的类,任意地替换。

**关键代码:**实现同一个接口。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

**注意事项:**如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

设计原则:

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

针对接口编程,而不是针对实现编程。

多用组合,少用继承

upload successful

/**
 * 描述:策略模式
 * Created by zjw on 2018-12-12 20:31
 */
public class StrategyTest {

    public static void main(String[] args) {
        Character c = new King();
        c.setWeapon(new AxeBehavior()).fight();
        c.setWeapon(new BowAndArrowBehavior()).fight();
        c.setWeapon(new KnifeBehavior()).fight();
        c.setWeapon(new SwordBehavior()).fight();

        Character c1 = new Queen();
        c1.setWeapon(new AxeBehavior()).fight();
        c1.setWeapon(new BowAndArrowBehavior()).fight();
    }

    // 武器行为接口
    interface WeaponBehavior {
        //怎么使用武器
        void useWeapon();
    }
    

    static class AxeBehavior implements WeaponBehavior {
        @Override
        public void useWeapon() {
            System.out.println("三板斧");
        }
    }

    static class BowAndArrowBehavior implements WeaponBehavior {
        @Override
        public void useWeapon() {
            System.out.println("弓箭射击");
        }
    }

    static class KnifeBehavior implements WeaponBehavior {
        @Override
        public void useWeapon() {
            System.out.println("匕首刺杀");
        }
    }

    static class SwordBehavior implements WeaponBehavior {
        @Override
        public void useWeapon() {
            System.out.println("剑斩");
        }
    }
    
    // 角色抽象
    static abstract class Character {
        public WeaponBehavior weapon;
        public abstract void fight();
        public Character setWeapon(WeaponBehavior weapon) {
            this.weapon = weapon;
            return this;
        }
    }

    static class King extends Character {
        @Override
        public void fight() {
            System.out.print(this.getClass().getSimpleName()+ ":发动");
            super.weapon.useWeapon();
        }
    }

    static class Knight extends Character {
        @Override
        public void fight() {
            System.out.print(this.getClass().getSimpleName()+ ":发动");
            super.weapon.useWeapon();
        }
    }

    static class Queen extends Character {
        @Override
        public void fight() {
            System.out.print(this.getClass().getSimpleName()+ ":发动");
            super.weapon.useWeapon();
        }
    }

    static class Troll extends Character {
        @Override
        public void fight() {
            System.out.print(this.getClass().getSimpleName()+ ":发动");
            super.weapon.useWeapon();
        }
    }

}

标签:策略,useWeapon,void,模式,fight,class,static,public
From: https://blog.51cto.com/u_11906056/6984941

相关文章

  • 观察者模式
    **介绍:**定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。**主要解决:**一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。**何时使用:**一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得......
  • 装饰者模式
    装饰者模式**装饰者模式:**动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。*设计原则:*类应该对扩展开放,对修改关闭继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。在我们的设计中,应该允许行为可以被扩展,而无须修改现有的代码。组合和......
  • 工厂方法模式
    工厂方法模式**工厂方法模式:**定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。设计原则:依赖倒置原则:要依赖抽象,不要依赖具体类。下面的指导方针,能避免在OO设计原则中违反依赖倒置原则:变量不可以持有具体的类的引用。不要让......
  • 通过 ChatGPT 赚钱:2023 年成功的简单策略
    欢迎来到技术与创收相结合的可能性世界!如果您曾经想过如何通过ChatGPT赚钱,那么您将进入一段激动人心的旅程。在本指南中,我们将探讨简单有效的策略,使您能够利用ChatGPT的强大功能来创造收入来源。无论您是内容创建者、企业主还是希望分享您的专业知识的人,ChatGPT都提供了一种......
  • 【Java】智慧工地管理系统源码(SaaS模式)
    智慧工地是聚焦工程施工现场,紧紧围绕人、机、料、法、环等关键要素,综合运用物联网、云计算、大数据、移动计算和智能设备等软硬件信息技术,与施工生产过程相融合。一、什么是智慧工地智慧工地是指利用移动互联、物联网、智能算法、地理信息系统、大数据挖掘分析等信息技术,提高项目......
  • openGauss学习笔记-32 openGauss 高级数据管理-批处理模式
    openGauss学习笔记-32openGauss高级数据管理-批处理模式openGauss支持从文本文件执行SQL语句。openGauss提供了gsql工具实现SQL语句的批量处理。以下场景建议使用批处理:如果您重复运行查询(例如,每天或每周),将其设为脚本可以让您避免每次进行重复输入。您可以通过复制和编辑脚......
  • C++工厂模式简易实现
    C++工厂模式简易实现引言:动态绑定是面向对象编程的重要功能,但C++目前还没有纳入标准库的反射机制,所以为了更方便的动态构造对象,使得通过配置文件的方式改变派生类对象,而不需要去修改代码,所以可以使用工厂这一常见的设计模式,来完成类对象的动态构造。基于C++11的新特性和模板,实现......
  • C#中CLR核心机制解析:垃圾回收与标准Dispose模式
    一、CLR核心机制1.1-创建对象的流程分配内存把对象传入到构造函数构造函数使用当前实例返回1.2-什么是堆/栈?堆-Heap:托管堆;一个程序运行时,该进程存放引用类型变量的一块内存,他是全局唯一的。栈-Stack:先进后出数据结构,线程栈;每一个线程存放变量和值类型的内存,随着线程......
  • day 122 - bean的作用域,生命周期,工厂模式
    bean的作用域在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围singleton(默认)在IOC容器中,这个bean的对象始终为单实例在ioc容器初始化时创建对象prototype这个bean在IOC容器中有多个实例在获取bean时创建对象<!--scope设置bean的作用域:......
  • mp-主键策略的学习
    自增主键@auto,要让插入的数据id自增需要使用注解该注解在实体类中添加@TableId(type=IdType.AUTO)注解然后在测试类中直接设置user属性值,使用方法insert插入即可。注意:需要在表中设置自增,切将自增的值与数据表中的主键值对应 @INPUT注解手动插入主键属性,同自增一样,在实体类......