简单工厂模式和策略模式

         两种模式如出一辙,基本方式都是通过将相同的行为封装在一个抽象父类(或接口)中,然后子类继承该抽象父类并对该相同的行为进行不同的实现。

         简单工厂模式:目的在于根据不同的条件创建不同的子类,工厂类的作用就是创建类。


         策略模式:比简单工厂模式多了一个context类,该类中保持对一个策略父类的引用。该模式对策略类的方法调用进行封装,但在客户端还是要进行选择性地手工创建策略类并作为参数传入context.

        

还可以将工厂模式和策略模式结合使用,进一步客户端的选择创建子类放到context中。

 

CashStrategy抽象父类:

public abstract class CashStrategy {

    public abstract double cashActive(double money);

}

CashRebateStrategy子类:

public classCashRebateStrategy extends CashStrategy {

    private double rebate;

    @Override

    public double cashActive(double money) {

        return money * rebate;

    }

    public CashRebateStrategy(double rebate) {

        this.rebate = rebate;

    }

//get set

}

CashReturnStrategy子类:

public class CashReturnStrategy extends CashStrategy {

    private double returnCondition;

    private double returnCount;

    @Override

    public double cashActive(double money) {

        if(money >= returnCondition){

            return money - Math.floor(money/ returnCondition)* returnCount;

        }

        return money;

    }

    public CashReturnStrategy(double returnCondition,double returnCount) {

        this.returnCondition =returnCondition;

        this.returnCount = returnCount;

    }

    //get set

}

CashNormalStrategy子类:

public classCashNormalStrategy extends CashStrategy {

    @Override

    public double cashActive(double money) {

        return money;

    }

}

StrategyFactoryContext上下文环境类:

public classStrategyFactoryContext {

    private CashStrategy cashStrategy;

//仅使用策略模式的情况

//publicStrategyFactoryContext(CashStrategy cashStrategy) {

//      this.cashStrategy= cashStrategy;

//  }

 

// 结合简单工厂模式(使用构造器)

    public StrategyFactoryContext(Stringselete) {

        switch(selete){

        case "8":

            this.cashStrategy = newCashRebateStrategy(0.8);

            break;

        case "300100":

            this.cashStrategy = newCashReturnStrategy(300,100);

            break;

        default:

            this.cashStrategy = new CashNormalStrategy();

        }

    }

// 结合简单工厂模式(使用具体方法进行初始化)

//  publicvoid createStrategyFactory(String selete){

//      //swith放到构造器中可以进一步降低代码复杂度---不用调用方法.

//      switch(selete){

//      case"8":

//          this.cashStrategy= new CashRebateStrategy(0.8);

//          break;

//      case"300100":

//          this.cashStrategy= new CashReturnStrategy(300,100);

//          break;

//      default:

//          this.cashStrategy= new CashNormalStrategy();

//      }

//  }

    // 封装了对相同行为的不同实现的调用

    public double contextInterface(double money){

        return cashStrategy.cashActive(money);

    }

}

 

 

public classTestClient {

 

    public static void main(String[] args) {

//      StrategyFactoryContextcontext = new StrategyFactoryContext();

//     

//      context.createStrategyFactory("8");

//      doubleresult = context.contextInterface(100);

//      System.out.println(result);

//     

//      context.createStrategyFactory("300100");

//      doubleresult1 = context.contextInterface(700);

//      System.out.println(result1);

//     

//      context.createStrategyFactory("");

//      doubleresult2 = context.contextInterface(500);

//      System.out.println(result2);

       

        StrategyFactoryContextcontext = newStrategyFactoryContext("8");

        double result =context.contextInterface(100);

        System.out.println(result);

    }

}

 

具体实例就是在当前项目中,玩家可以选择将武将转化为经验书、金币等情况,其实就是不同的转化策略:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值