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

使用这三种模式设计一个简单的计算器程序:计算器是用于计算数值之间进行数学计算后所获得的值。它包含基本的"加减"功能。以上对以上需求进行分析可以得出计算有两种策略(+与-)。

计算策略的实现:

/*抽象策略*/public interface Strategy{    /*定义了计算策略所拥有的算法*/    public int calculate(int a,int b);}

/*加法策略的实现*/public class AddStrategy implements Strategy{    @Override    public int calculate(int a, int b)    {        return a+b;    }}

/*减法策略的实现*/public class SubStrategy implements Strategy{    @Override    public int calculate(int a, int b)    {        return a-b;    }}

此时还需要一个封装策略的对象,让策略可以互换:

public class StrategyContext{    /*封装了策略对象*/    private Strategy strategy = null;

    public StrategyContext(Strategy strategy)    {        this.strategy = strategy;    }

    /*实现了策略可以互换的功能*/    public void setStrategy(Strategy strategy)    {        this.strategy = strategy;    }

    public int execute(int a,int b)    {        return this.strategy.calculate(a, b);    }}

  为了避免策略模式必须要将具体的策略暴露给高层模块的缺点,我们使用工厂来生成策略,现在高层模块只需要一个约束条件就可以获得需要的策略。
策略生成工厂的实现:

/*策略生成抽象工厂*/public interface Factory{    /*定义一个生成策略的接口,其参数还可以使用一个配置文件来实现约束条件,这里使用了枚举*/    public Strategy createStrategy(StrategyEnum strategyEnum);}

public class StrategyFactory implements Factory{    @Override    public Strategy createStrategy(StrategyEnum strategyEnum)    {        Strategy strategy = null;

        try        {            String strategyName = strategyEnum.getStrategyName();            Class<?> clazz = Class.forName(strategyName);            strategy = (Strategy)clazz.newInstance();        }        catch (Exception e)        {            e.printStackTrace();        }

        return strategy;    }}

  每次进行计算的步骤为:获取工厂、获取策略、封装策略、计算结果。这样写比较麻烦,高层模块为了计算一个结果还需要记住执行顺序,这时候我们可以使用门面模式来屏蔽子系统的复杂性,为高层模块提供一个计算接口即可。

计算机器门面的实现:

public class FacadeContext{    /*门面模式不参与子系统的逻辑,所以对子系统进行了一次封装*/    private Factory factory = new StrategyFactory();    private StrategyContext context = new StrategyContext(null);

    public FacadeContext(){}

    public int calculate(int a,int b,StrategyEnum strategy)    {        this.context.setStrategy(this.factory.createStrategy(strategy));        return this.context.execute(a, b);    }}

/*计算器的门面,简单的委托类,为高层提供一个反问子系统的接口,让高层模块不再依赖子系统*/public class CalculatorFacade{    private FacadeContext context = new FacadeContext();

    public CalculatorFacade()    {}

    public int calculate(int a,int b,StrategyEnum strategy)    {        return this.context.calculate(a, b, strategy);    }}

来看看场景类:

public class Client{    public static void main(String[] args)    {        /*获取门面,使用其提供的接口访问子系统*/        CalculatorFacade calculatorFacade = new CalculatorFacade();        System.out.println("2+2="+calculatorFacade.calculate(2, 2, StrategyEnum.ADD));    }}

附:StrategyEnum枚举代码:

public enum StrategyEnum{    ADD("com.suxiaolei.calculator.strategy.AddStrategy"),    SUB("com.suxiaolei.calculator.strategy.SubStrategy");

    private String strategyName;

    private StrategyEnum(String strategyName)    {        this.strategyName = strategyName;    }

    public String getStrategyName()    {        return this.strategyName;    }}

  以上是混合使用三种模式的一个简单例子,可以看出灵活搭配模式能让系统更健壮,灵活性更高,扩展性更强。在上述例子添加策略非常非常的容易,只需要继承Strategy接口即可,然后在枚举中增加对应的策略类名即可,高层代码一点也不用改变。其实要是使用配置文件的方式,则只需要继承Strategy接口,都不用枚举了,这样更灵活。

时间: 2024-12-17 18:04:16

混合模式(策略模式+工厂方法模式+门面模式)的相关文章

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

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

今天来讲一下如何通过策略模式和工厂方法来消除累赘的if...else,具体什么是策略模式,大家可以自行百度学习,我就不再这里做过多的介绍了. 注意:如果业务场景简单,建议使用if...else,因为代码逻辑简单,便于理解 策略接口 Eat.java /** * 策略接口 * */ public interface Eat { public void eatFruit(String fruit); } 策略类 EatApple.java /** * 具体的策略类:吃苹果 */ public cla

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

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

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

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

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

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

第4章 创建型模式—工厂方法模式(2)

2. 工厂方法模式 2.1工厂方法模式的定义 (1)定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类 ①Product:定义了工厂方法创建对象的接口.也就是实际需要使用的产品对象的接口 ②ConcreteProduct:具体的Product接口的实现对象. ③Factory(Creator):定义了工厂方法的抽象类并返回一个产品对象. ④ConcreteCreator:具体的创建器对象,该类实现和覆盖了父工厂类声明的方法.返回一个具体的Product实例