15【策略设计模式】

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 15【策略设计模式】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文


十五、策略设计模式

15.1 行为型设计模式简介

行为型设计模式目的是将多个类或对象相互协作,以及怎样合理分配职责,共同完成单个类或对象无法单独完成的任务。

在GoF中行为型设计模式有:解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式共11种。

15.2 策略设计模式简介

15.2.1 策略设计模式概述

策略模式(Strategy Pattern):策略模式将定义的一系列算法单独封装起来,让它们之间可以相互替换,并且算法的变化不会影响使用算法的用户;

策略模式的核心就是使用继承和多态,从而实现同一种行为在不同的场景下具备不同的实现(算法),达到不同的功能;

15.2.2 策略设计模式的UML类图

策略设计模式中主要包含3个角色:

  • 1)上下文角色(Context):用来操作具体策略的上下文环境,屏蔽高层模块(调用者)对策略算法本身的直接访问,解耦高层模块与具体策略算法;
  • 2)抽象策略角色(IStrategy):规范策略或算法的行为;
  • 3)具体策略角色(Concrete Strategy):实现了抽象策略,提供具体的策略(算法)

在这里插入图片描述

15.3 策略设计模式的实现

【案例】

在网站登录时,很多网站都会提供多种登录方式,如QQ、微信、微博等登录方式。不管是哪种登录方式其根本都是登录成功后获取用户的一些认证信息,来识别该用户;

  • 1)设计抽象角色(IStrategy):登录功能的规范定义
package com.pattern.demo01_策略模式的实现;

/**
 * @author lscl
 * @version 1.0
 * @intro: 抽象策略角色,用于规范策略
 */
public interface ILoginStrategy {
    void login();
}
  • 2)具体策略1-QQ登录(ConcreteStrategy):登录功能的实现者
package com.pattern.demo01_策略模式的实现;

/**
 * @author lscl
 * @version 1.0
 * @intro: 策略算法的实现(具体策略)
 */
public class QQLoginStrategy implements ILoginStrategy{
    @Override
    public void login() {
        System.out.println("采用QQ登录....");
    }
}
  • 3)具体策略2-微信登录(ConcreteStrategy):登录功能的实现者
package com.pattern.demo01_策略模式的实现;

/**
 * @author lscl
 * @version 1.0
 * @intro: 策略算法的实现(具体策略)
 */
public class WxLoginStrategy implements ILoginStrategy{
    @Override
    public void login() {
        System.out.println("采用微信登录....");
    }
}
  • 4)具体策略3-微博登录(ConcreteStrategy):登录功能的实现者
package com.pattern.demo01_策略模式的实现;

/**
 * @author lscl
 * @version 1.0
 * @intro: 策略算法的实现(具体策略)
 */
public class WeiBoLoginStrategy implements ILoginStrategy {
    @Override
    public void login() {
        System.out.println("采用微博登录");
    }
}
  • 5)上下文对象(Context):登录功能操作者
package com.pattern.demo01_策略模式的实现;

/**
 * @author lscl
 * @version 1.0
 * @intro: 策略的执行者,
 */
public class LoginExecute {

    private ILoginStrategy strategy;

    public LoginExecute(ILoginStrategy strategy) {
        this.strategy = strategy;
    }

    // 执行策略
    public void execute() {
        System.out.println("打开网页");
        try {
            strategy.login();
        } catch (Exception e) {
            throw new RuntimeException("登录失败!");
        }
        System.out.println("登录成功");
    }
}

15.4 策略模式的优缺点

  • 优点:
    • 符合开闭原则,扩展性强,可以轻松更换策略类,实现不同的功能
  • 缺点:
    • 客户端必须知道所有的策略,并且自行决定使用哪一个策略类
    • 使用策略模式将会产生很多的策略类,增加维护难度

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131688.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!