策略模式+工厂方法消除if...else

今天来讲一下如何通过策略模式和工厂方法来消除累赘的if...else,具体什么是策略模式,大家可以自行百度学习,我就不再这里做过多的介绍了。

注意:如果业务场景简单,建议使用if...else,因为代码逻辑简单,便于理解

策略接口

Eat.java

/**
 * 策略接口
 *
 */
public interface Eat {

    public void eatFruit(String fruit);

}

策略类

EatApple.java

/**
 * 具体的策略类:吃苹果
 */
public class EatApple implements Eat{

    @Override
    public void eatFruit(String fruit) {
        System.out.println("吃苹果");
    }

}

EatBanana.java

/**
 * 具体的策略类:吃香蕉
 */
public class EatBanana implements Eat {

    @Override
    public void eatFruit(String fruit) {
        System.out.println("吃香蕉");
    }

}

EatPear.java

/**
 * 具体的策略类:吃梨
 */
public class EatPear implements Eat {

    @Override
    public void eatFruit(String fruit) {
        System.out.println("吃梨");
    }

}

策略上下文

EatContext.java

/**
 * 策略上下文
 */
public class EatContext {

    private Eat eat;

    public EatContext(Eat eat) {
        this.eat = eat;
    }

    public void eatContext(String fruit) {
        eat.eatFruit(fruit);
    }

}

策略工厂类

EatFactory.java

/**
 * 策略工厂类
 */
public class EatFactory {

    private static Map<String, Eat> map = new HashMap<>();

    static {
        map.put("apple", new EatApple());
        map.put("banana", new EatBanana());
        map.put("pear", new EatPear());
    }

    public static Eat getEatStrategy(String fruitType) {
        return map.get(fruitType);
    }
}

测试

public class Demo {

    public static void main(String[] args) {
        String fruit = "apple";
        // 传入具体水果类型,得到苹果策略接口
        Eat eat = EatFactory.getEatStrategy(fruit);
        // 调用具体策略方法
        eat.eatFruit(fruit);
    }
}

测试结果:

吃苹果

第一次写博客,写的不好的地方,还望大家留言指教!

原文地址:https://www.cnblogs.com/fztomaster/p/11434405.html

时间: 2024-11-13 08:52:57

策略模式+工厂方法消除if...else的相关文章

混合模式(策略模式+工厂方法模式+门面模式)

使用这三种模式设计一个简单的计算器程序:计算器是用于计算数值之间进行数学计算后所获得的值.它包含基本的"加减"功能.以上对以上需求进行分析可以得出计算有两种策略(+与-). 计算策略的实现: /*抽象策略*/public interface Strategy{ /*定义了计算策略所拥有的算法*/ public int calculate(int a,int b);} /*加法策略的实现*/public class AddStrategy implements Strategy{ @Ov

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

简单工厂模式\工厂方法模式

工厂模式 一.本节目标 我们本节课程主要介绍[工厂模式]的相关知识,将会涉及以下内容: 什么是工厂模式 工厂模式类图 工厂模式代码 工厂模式应用 PS:学习 Java 设计模式之前最好有一定的 Java 语言基础.由于讲这种东西其实比较枯燥,为了让大家学习起来轻松愉快一点,我会尽量使用一些生动.形象和幽默的例子. 二.什么是工厂模式 工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象.工厂模式根据不同的参数来实现不同的分配

大话设计模式之简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

Java的23中设计模式--工厂方法模式(Factory Method)

1.普通工厂模式 工厂类 /** * @Title Factory.java * @Package factory.factory1 * @date 2015-1-22 上午10:16:02 * @version V1.0 */ package factory.factory1; /** * @ClassName Factory * @date 2015-1-22 上午10:16:02 */ public class Factory { public Sender procedure(Strin

设计模式之工厂模式-工厂方法(02)

接着上一篇的工厂模式,工厂方法.由于简单工厂的扩展性不好,下面工厂方法,在这上面有了优化! (二)工厂方法(多态工厂模式) 工厂方法描述:定义一个创建产品对象的工厂接口(总厂是接口,里面只规定了获得具体产品实例的方法),实际创建工作推迟到实现总厂接口的子类当中.这样的好处是,可以在不修改具体工厂角色的情况下引进新的产品(即是不像简单工厂那样,增加一个具体产品,比如:增加了个浙大学生,要把在工厂中的方法中增加逻辑判断,),利于维护了: 工厂方法的角色及其职责:(1)抽象工厂角色[creator]:

高效的策略模式设计方法

在实现策略模式的时候,我们习惯用switch-case来代替if-else if-else,在代码结构上会更加清晰,但这也只是从代码结构这个层面上来考虑,我们可以从代码速度上来考虑设计问题. 无论是switch-case还是if-else if-else的设计,都会遇到一个问题:如果判断的条件很多,假设是n个,而满足的条件恰好是最后一个,那么代码的执行效率就是o(n). 为了找到一个能够执行的代码,我们实际上是判断了n次,当然,这个判断其实是很快的,一般情况下的效率折损是不用考虑的,就算判断条件

工厂模式——工厂方法模式

工厂方法模式,咋一看在这个计算器程序里好像反而使程序变得更加“复制”,确实代码量好像是增加了,到底有什么好处呢?我想多领会领会,必然有它存在的理由. 我们先来看看“简单工厂模式”和“工厂方法模式”的类继承关系.上篇提到的“简单工厂模式”的类继承关系如下图所示: “工厂方法模式”的类继承关系如下图所示: 发现四个运算类分别有了各自的工厂类,这是为什么呢?我们先来实现代码. 运算符抽象类以及四个它的实现类不做任何变动,参照上篇. 由于多了四个工厂类,所以把工厂类抽象成一个工厂类接口. package

应用最广泛的模式-工厂方法模式

1.工厂方法模式的定义: 定义一个用于创建对象的接口,让子类决定实例化哪个类. /**抽象产品类**/ public  abstract class Product{ //产品类的抽象方法 //由具体的产品类去实现 public abstract void method(); } /**具体产品类A**/ public class ConcreteProductA extends Product{ @Override public void method(){ System.out.printl