• 设计模式之策略模式


    先大致介绍下设计模式,总共有 23 种设计模式。

    这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。当然,我们还会讨论另一类设计模式:J2EE 设计模式。

    近日学习了几个常见的设计模式,比如策略模式

    策略模式(Strategy):策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合

    优点:
    1.策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为.继承有助于析取出这些算法中的公共功能[DP]
    2.简化了单元测试,因为每个算法都有自己的类,可以通过接口单独测试[DPE]
    3.当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择和是的行为.将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句[DP]

    策略模式结构图:

     学习的时候发现这些概念太过抽象而且不易于记忆,就写了两个实例,实例如下:

    实例一:

    场景:赵云跟随刘备去东吴求亲,诸葛亮交与他三个锦囊,最后让孙权赔了夫人又折兵

    首先创建了一个公共接口,创建operate方法

    public interface IStrategy {
        void operate();
    }

    然后创建三个子类(也就是三个锦囊)去实现公共接口:

    三个子类都实现了公共接口也继承了operate方法

    public class FirstMethod implements IStrategy {
        @Override
        public void operate() {
            System.out.println("找乔国老帮忙,让吴国太给孙权");
        }
    }
    
    
    
    public class SecondMethod implements IStrategy {
        @Override
        public void operate() {
            System.out.println("求吴国太开个绿灯");
        }
    }
    
    
    
    public class ThirdMethod implements IStrategy {
        @Override
        public void operate() {
            System.out.println("孙夫人断后");
        }
    }

    然后创建一个Context类,锦囊妙计要放在锦囊里面

    public class Context {
        IStrategy iStrategy;
        //构造函数,要你使用哪个策略
        public Context(IStrategy strategy){
            this.iStrategy = strategy;
        }
    
        public void operate(){
            this.iStrategy.operate();
        }
    }

    最后就是客户端赵云携带锦囊遇到不同场合打开不同锦囊:

    public class ZhaoYun {
    
        public static void main(String[] args){
            Context context;
            System.out.println("----------刚到吴国拆开第一个------------");
            context = new Context(new FirstMethod());
            context.operate();//拆开执行
            System.out.println("************************************");
    
            System.out.println("----------刚到吴国拆开第二个------------");
            context = new Context(new SecondMethod());
            context.operate();
            System.out.println("************************************");
    
            System.out.println("----------刚到吴国拆开第三个------------");
            context = new Context(new ThirdMethod());
            context.operate();
            System.out.println("************************************");
        }
    
    }

    运行结果:

     实例二:

    场景:有以下角色:国王(King)、皇后(Queen)、骑士(Knight)、妖怪(Troll),这些角色可以在游戏中每一次使用一个武器(Weapon)来攻击对方,并且可以在运行时切换武器

    先创建一个使用武器的公告接口

    public interface WeaponBehavior {
         void useWeaPon();
    }

    然后创建各个武器的类来实现公共接口

    public class KnifeBehavior implements WeaponBehavior {
        @Override
        public void useWeaPon() {
            System.out.println("我使用宝剑");
        }
    }
    
    
    
    public class AxeBehavior implements WeaponBehavior {
        @Override
        public void useWeaPon() {
            System.out.println("我使用斧头");
        }
    }
    
    
    
    public class BowAndArrowBehavior implements WeaponBehavior {
        @Override
        public void useWeaPon() {
            System.out.println("我使用弓箭");
        }
    }
    
    
    
    public class SwordBehavior implements WeaponBehavior {
        @Override
        public void useWeaPon() {
            System.out.println("我使用匕首");
        }
    }

    接着创建一个角色的抽象类和一个抽象方法display

    public abstract class Role {
        WeaponBehavior weaponBehavior;
        //构造器
        public Role(){
        }
        public void setWeaponBehavior(WeaponBehavior weaponBehavior){
            this.weaponBehavior = weaponBehavior;
        }
        abstract void display();
        public void weaponWay(){
            weaponBehavior.useWeaPon();
        }
    }

    接下来就是创建各个角色的子类继承角色类并实现抽象方法

    public class King extends Role {
    
        public King(){
            weaponBehavior = new AxeBehavior();
        }
        @Override
        void display() {
            System.out.println("我是国王");
        }
    }
    
    
    
    public class Queen extends Role {
    
        public Queen(){
            weaponBehavior = new KnifeBehavior();
        }
        @Override
        void display() {
            System.out.println("我是皇后");
        }
    }
    
    
    public class Knight extends Role{
        public Knight(){
            weaponBehavior = new SwordBehavior();
        }
    
        @Override
        void display() {
            System.out.println("我是骑士");
        }
    }
    
    
    
    
    public class Troll extends Role {
        public Troll(){
            weaponBehavior = new SwordBehavior();
        }
        @Override
        void display() {
            System.out.println("我是妖怪");
        }
    }

    最后创建一个测试类

    public class Test {
        public static void main(String[] args){
            King king = new King();
            king.display();
            king.weaponWay();
            System.out.println("更换武器");
            king.setWeaponBehavior(new SwordBehavior());
            king.weaponWay();
            System.out.println("--------------------");
    
            Queen queen = new Queen();
            queen.display();
            queen.weaponWay();
            System.out.println("更换武器");
            queen.setWeaponBehavior(new AxeBehavior());
            queen.weaponWay();
            System.out.println("--------------------");
    
            Knight knight = new Knight();
            knight.display();
            knight.weaponWay();
            System.out.println("更换武器");
            knight.setWeaponBehavior(new BowAndArrowBehavior());
            knight.weaponWay();
            System.out.println("--------------------");
    
            Troll troll = new Troll();
            troll.display();
            troll.weaponWay();
            System.out.println("更换武器");
            troll.setWeaponBehavior(new KnifeBehavior());
            troll.weaponWay();
            System.out.println("--------------------");
        }
    }

    运行的结果是:

  • 相关阅读:
    Web API中的消息处理程序(Message Handler)
    Web API中的模型验证
    autoconf配置的项目,编译debug版本
    gcc编译工具生成动态库和静态库之一----介绍
    VMware中四种网络连接模式的区别
    vmware虚拟机三种网络模式的区别
    code block自动生成makefile
    centos7 安装 codeblock(rpm)
    利用cbmakegen导出Code::blocks的Makefile
    C/C++程序CPU问题分析
  • 原文地址:https://www.cnblogs.com/Lukizzz/p/9685822.html
Copyright © 2020-2023  润新知