设计模式入门:策略模式

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片
文章中部分定义和解释性文字,都是引用百度百科,主要的代码及场景应用为本人原创

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

场景:我在设计一个后台管理系统时有一个主题更换的需求,要求是有预制的几套主题样式,同时还能用户自定义样式,针对这个需求可以采用策略模式

设计

这里写图片描述

构成

  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现(ThemeColor,ThemeBackground)。
  • 具体策略角色:包装了相关的算法和行为(DefaultColor,DefaultBackground …)。
  • 环境角色:持有一个策略类的引用,最终给客户端调用(Theme)。

实现

代码地址:https://github.com/telundusiji/designpattern

ThemeColor 颜色接口

public interface ThemeColor {
    void color();
}

ThemeBackground 背景接口

public interface ThemeBackground {
    void background();
}

DefaultColor 默认颜色

public class DefaultColor implements ThemeColor {
    public void color() {
        System.out.println("默认的主题色");
    }
}

BlueColor 蓝色(其他实现)

public class BlueColor implements ThemeColor {
    public void color() {
        System.out.println("蓝色的主题色");
    }
}

DefaultBackground 默认背景

public class DefaultBackground implements ThemeBackground {
    public void background() {
        System.out.println("默认的背景");
    }
}

SkyBackground 天空背景(其他实现)

public class SkyBackground implements ThemeBackground{
    public void background() {
        System.out.println("Sky的背景");
    }
}

Theme 主题(应用场景)

public class Theme {
    private ThemeColor color;
    private ThemeBackground background;

    public Theme() {
        this.color = new DefaultColor();
        this.background = new DefaultBackground();
    }

    public Theme(ThemeColor color, ThemeBackground background) {
        this.color = color;
        this.background = background;
    }

    public ThemeColor getColor() {
        return color;
    }

    public void setColor(ThemeColor color) {
        this.color = color;
    }

    public ThemeBackground getBackground() {
        return background;
    }

    public void setBackground(ThemeBackground background) {
        this.background = background;
    }

    public void show() {
        color.color();
        background.background();
    }
}

经典应用
JDK中的java.util.Comparator和import java.util.Collections.sort(list,comparator);

  • Comparator接口为抽象策略角色
  • 每一个实现Comparator接口的类为具体策略角色
  • Collections.sort()为环境角色

这样只要实现Comparator接口的类只需要指明两个实例是如何比较大小,就可以使用sort方法实现排序,而无需知道排序所使用什么算法。

优缺点

优点:

  • 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
  • 策略模式提供了可以替换继承关系的办法。
  • 使用策略模式可以避免使用多重条件转移语句。

缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式造成很多的策略类,每个具体策略类都会产生一个新类,这样会导致策略类太多不便于管理维护

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值