专栏首页Android-薛之涛Java-策略设计模式

Java-策略设计模式

今天 我们来学习一下策略模式,什么是策略模式呢?比如我们一个功能的实现可以有多个策略去选择,比如:出行方式可以选择:共享单车,拼车,私家车,出租等。如果将这个出行方式提供一个统一的接口,每个策略都有自己的实现类,客户端就可以通过实现具体的策略对象来完成功能,而这样的策略是可以动态替换的,扩展性和维护性及代码可读性较高,这就是就是策略模式。

策略模式遵循的是:对修改关闭,对拓展开发的原则。且针对接口编程,而不是针对实现编程

1.代码实现

  • 第一步写业务接口 接下来我们用代码告诉大家一下,以我们日常网络购物为例,首先定义两个接口一个商品种类接口,一个商品名称接口:
public interface IGoodsKinds {
    //输入商品种类方法
    String iGoodsKinds(String goodsKinds);
}
public interface IGoodsName {
    //输入商品名称方法
    String iGoodsName(String goodsName);
}
  • 第二步实现具体类 然后我们定义具体的实现类,商品种类实现类可以有:家用电器,瓜果蔬菜。 商品名称也就是可以供选择的商品有:智能冰箱(家用电器),智能空调(家用电器),香蕉(瓜果蔬菜),苹果(瓜果蔬菜)等
public class HomeAppliance implements IGoodsKinds {
    @Override
    public String iGoodsKinds() {
        return "选择购买的商品种类是:家用电器";
    }
}

public class FruitVegetable implements IGoodsKinds {
    @Override
    public String iGoodsKinds() {
        return "选择购买的商品种类是:瓜果蔬菜";
    }
}

public class AppleGoods implements IGoodsName {
    @Override
    public String iGoodsName() {
        return "选择的商品名称是:苹果";
    }
}
public class BananaGoods implements IGoodsName {
    @Override
    public String iGoodsName() {
        return "选择的商品名称是:香蕉";
    }
}
public class RefrigeratorGoods implements IGoodsName {
    @Override
    public String iGoodsName() {
        return "选择的商品名称是:智能冰箱";
    }
}
public class AirConditioner implements IGoodsName {
    @Override
    public String iGoodsName() {
        return "选择的商品名称是:智能空调";
    }
}
  • 第三步 定义 BasePattern具体的购物流程基类
public abstract class BasePattern {
    IGoodsKinds mIGoodsKinds;
    IGoodsName mIGoodsName;

    public void setGoodsKinds(IGoodsKinds iGoodsKinds){
        this.mIGoodsKinds =iGoodsKinds;
    }

    public void setmIGoodsName(IGoodsName mIGoodsName){
        this.mIGoodsName =mIGoodsName;
    }

    //打印用户选择的商品种类
    public void printGoodsKinds(){
        if(mIGoodsKinds != null){
            System.out.println(mIGoodsKinds.iGoodsKinds());
        }
    }
    //打印用户选择的商品名称
    public void printGoodsName(){
        if(mIGoodsName != null){
            System.out.println(mIGoodsName.iGoodsName());
        }
    }

    //公共方法,判断用户是否是会员
    public abstract String isMembers(int membersCode);
    
}

最后购物的实现类:

public class MemberPattern extends BaseShopingPattern {
    @Override
    public String isMembers(int membersCode) {
        if(membersCode == 0){
            return "该用户为会员用户";
        }else{
            return "该用户为普通用户";
        }
    }
}

调用:

结果打印展示:

image.png

2.策略模式的优缺点

优点:
  • 可以把公共方法移动到父类,结构清晰,减少代码冗余,增强代码可读性,适用于项目庞大多个策略的情况。
缺点:
  • 客户端需了解所有的策略类,适用于客户端知道算法或者行为的情况,多个策略会有多个实现类。

适用场景:策略设计模式适用于某个业务或行为有多个实现类,且在一次运行中当前业务只会执行一种实现类的情况。 完毕!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java-反射

    参考:https://mp.weixin.qq.com/s/UYqPCmo2vpAibJPh6cupLw

    android_薛之涛
  • Android-Lambda表达式

    Lambda,中文名“兰布达”。是匿名函数的别名,Java8后开始引入Lambda表达式.而Android方面Android Studio 2.4 Previe...

    android_薛之涛
  • Andriod-Dagger2

    参考资料: https://www.jianshu.com/p/1d84ba23f4d2 https://mp.weixin.qq.com/s/lh3dgJ...

    android_薛之涛
  • 依赖注入容器-- Autofac

    Autofac---Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高...

    小世界的野孩子
  • java设计模式(9)-桥接模式

    这篇推文分享一下桥接模式,JDBC原理也是运用了桥接模式,先设置驱动名称,链接,来获得数据库链接,降低耦合,减少维护

    爱敲代码的猫
  • Java面向对象之抽象类,接口

    抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中...

    二十三年蝉
  • 生成器模式builder

    生成器模式即建造者模式builder,是创建型的设计模式,主要的目的是封装一个对象的构造过程,并运行按步骤构造,我们所熟知的StringBuilder和Stri...

    黑白格
  • 设计模式学习 - 工厂模式

    根据不同的对象,提供不同的工厂,然后由客户端来选择对应的工厂。这也是与简单工厂模式的不同的地方。

    许杨淼淼
  • PHP反射类export方法详细解析

    CrazyCodes
  • 第76节:Java中的基础知识

    设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat

    达达前端

扫码关注云+社区

领取腾讯云代金券