《大话设计模式》之策略模式

策略模式

1.定义

定义算法/策略,分别封装起来,让它们之间可以互相替换。把对象本身和运算规则区分开来。

所有这些算法/策略完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法/策略,减小了各种算法类与使用算法类之间的耦合。

只用在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用。

2.实现结构
这里写图片描述

//定义相同工作的抽象类
public abstract class CashSuper {
    public abstract double acceptCash(double money);
}
public class CashContext {
    //1.声明一个功能类
    private CashSuper cs;
    //2.传入功能类的实现类
    public CashContext(CashSuper cs) {
        this.cs = cs;
    }
    //3.返回功能类的功能,也是实现类的功能实现
    public double GetResult(double money) {
        return  cs.acceptCash(money);
    }
}
//用不同方式完成相同工作
public class CashRebate extends CashSuper {
    private double moneyRebate=1d;  
    public CashRebate(double moneyRebate) {
        this.moneyRebate = moneyRebate;
    }
    @Override
    public double acceptCash(double money) {
        // TODO Auto-generated method stub
        return money*moneyRebate;
    }
}
public class CashNormal extends CashSuper { 
    @Override
    public double acceptCash(double money) {
        return money;
    }
}
//使用
    public void accept(String key){     
        CashContext cc=null;
        switch (key) {
        case "CashNormal":
            cc=new CashContext(new CashNormal());
            break;
        case "CashRebate":
            cc=new CashContext(new CashRebate(0.8));
            break;
        default:
            break;
        }
        double total=cc.GetResult(500);     
    }

以上方法使用策略模式,但是用客服端来判断使用哪个算法。

下面是策略模式与简单工厂结合,使得判断算法放在Context来。

//使用
    public static void main(String[] args) {
        CashContext cc=new CashContext("normal");
        double total=cc.GetResult(300);
        System.out.println(total);
    }
书上还有单独使用工厂模式,客户端使用如下:
CashSuper csuper=CashFatory.createCashAccept("normal");
    ...=csuper.GetResult(...);

区别:
单独使用简单工厂模式,客户端需要认识两个类。

简单工厂模式与策略模式区别:其实这两种模式不是同一种场景同一层面的可替换模式,而是一个场景的不同层面的不同模式。

策略模式:
不同算法封装成不同对象
好处:是算法可独立于使用它的客户而变化.
目标只有一个实现,却有不同方法

工厂模式:
把客户端与不同对象进行解耦
好处:代替了new关键字,
对象之间的依赖降低了
降低了耦合度

因此,这两种模式通常是结合起来一起使用。

以下代码来自《Thinking in java》:

 class Processor {

    public String name(){
        return getClass().getSimpleName();
    }
    Object  process(Object input){
        return input;
    }
}
public class Downcase extends Processor{
    @Override
    String process(Object input){
        return ((String)input).toLowerCase();
    }
}
public class Upcase extends Processor{
    @Override
    String process(Object input){
        return ((String)input).toUpperCase();
    }
}
public class Splitter extends Processor{

    @Override
    String process(Object input){
        return Arrays.toString(((String)input).split(" "));
    }
}
public class Apply {
    public static void process(Processor p,Object s){
        System.out.println("using process"+p.name());
        System.out.println(p.process(s));
    }

    public static String s="sasa sasas";

    public static void main(String[] args) {
        process(new Upcase(), s);
        process(new Downcase(),s);
        process(new Splitter(), s);
        }
}

创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,称为策略模式。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值